题目来自《剑指offer》
JZ46 把数字翻译成字符串
一开始没有考虑到数字里有0的情况,后来重新推翻写一套逻辑判断比在开始的逻辑上修改快得多:
class Solution {
public:
int solve(string nums) {
if(nums.size()==0||(nums[0]=='0'))
return 0;
if(nums.size()==1)
return 1;
int m=nums.size();
int* p = new int[m];
p[0]=1;
if(((nums[0]=='1')&&((nums[1]>='1')&&(nums[1]<='9')))||
((nums[0]=='2')&&((nums[1]>='1')&&(nums[1]<='6'))))
p[1]=2;
else
p[1]=1;
for(int i=2;i<m;i++)
{
if(nums[i]=='0')
{
if(nums[i-1]=='1'||nums[i-1]=='2')
p[i]=p[i-2];
else
return 0;
}
else
{
if((nums[i-1]=='1')||((nums[i-1]=='2')&&(nums[i]<='6')))
p[i]=p[i-1]+p[i-2];
else
p[i]=p[i-1];
}
}
return p[m-1];
}
};
JZ21 调整数组顺序使奇数位于偶数前面(一)
class Solution {
public:
vector<int> reOrderArray(vector<int>& array) {
int pre=0;
int l=0;
while(pre<array.size())
{
while(pre<array.size()&&array[pre]%2==0)
pre++;
if(pre==array.size())
return array;
int temp=array[pre];
array.erase(array.begin()+pre);
array.insert(l+array.begin(),temp);
l++;
pre++;
}
return array;
}
};
错误版本:
while(array[pre]%2==0)
pre++;
错误原因:
如果全是偶数,pre指向end,又进行了访问
JZ24 反转链表
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(!pHead)
return nullptr;
if(pHead->next==nullptr)
return pHead;
ListNode* cur = pHead;
ListNode* next = pHead->next;
while(next) //注意
{
ListNode* t=next->next;
if(cur==pHead)
{
cur->next=nullptr;
next->next=cur;
cur=next;
next=t;
}
else
{
next->next=cur;
cur=next;
next=t;
}
if(!next)
pHead=cur;
}
return pHead;
}
};
错误版本:
while(cur->next)
//错误原因,cur->已经不指向空而指向前一个节点,不能做为循环退出条件
JZ3 数组中重复数字
class Solution {
public:
int duplicate(vector<int>& numbers) {
if(numbers.size()==0)
{
return -1;
}
for(auto e:numbers)
{
if(e<0||e>=(int)numbers.size())
{
return -1;
}
}
auto p1=numbers.begin();
auto p2=numbers.end();
while(p2 > p1)
{
p2--;
if(*p1 == *p2 && p1 != p2)
{
return *p1;
}
if(p1 == p2)
{
p1++;
p2=numbers.end();
}
}
return -1;
}
};
错误版本:
class Solution {
public:
int duplicate(vector<int>& numbers) {
if(numbers.size()==0)
{
cout<<-1;
return 0;
}
for(auto e:numbers)
{
if(e<0||e>=(int)numbers.size())
{
cout<<-1;
return 0;
}
}
auto p1=numbers.begin();
auto p2=numbers.end();
while(p2>p1)
{
p2--;
if(*p1==*p2&&p1!=p2)
{
cout<<*p1;
return 0;
}
if(p1==p2)
{
p1++;
p2=numbers.end();
}
}
cout<<-1;
return false;
}
};
错误原因:答案应该作为返回值,而不是输出
JZ73 翻转单词序列
reverse 时间复杂度为O(n)
string ReverseSentence(string str) {
if(str.empty())
return "";
reverse(str.begin(),str.end());
auto p1=str.begin();
auto p2=str.begin();
for(auto i=str.begin();i<=str.end();i++)
{
if(*i==' '||i==str.end())
{
p2=i;
reverse(p1,p2);
p1=p2+1;
}
}
return str;