0
点赞
收藏
分享

微信扫一扫

那些年做oj我写的bug

鱼板番茄 2022-04-06 阅读 38
c++算法

题目来自《剑指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;
    
举报

相关推荐

0 条评论