牛客网 剑指offer系列 错题记录一

7/10 题目:扑克牌顺子 ,看过剑指offer的一定知道这道题,当时看过了觉得蛮简单,过了几天,在牛客网选这题做的时候却没有一次编译通过,错误都是细节的,好记性不如烂笔头,所以写在这里记录下,希望能够温故知新。

     凭着理解和记忆,第一次的代码如下

class Solution {
public:
    bool IsContinuous( vector numbers ) {
        sort(numbers.begin() ,numbers.end());
       vector::iterator iter = numbers.begin();
        int numOfZero = 0;
        int numOfGap = 0;
        for(;iter < numbers.end() && (*iter) == 0 ;++ iterator)
            {
               numOfZero ++ ;
        } 
        iter = numbers.begin();
        ++ iter;
        for( ; iter < numbers.end() ; ++ iter)
            {
            if((*iter)  == (*(iter - 1)))  {
                return false ;
            }
             numOfGap += (*iter) - (*(iter - 1)) -1;
        }
        return numOfGap > numOfZero ? false : true ;
    }
    
};
这段代码有很多错误,首先是第一处标红的地方,是个严重的错误,本意是++iter,这里却写了iterator ,编译直接不过!!!敲代码一定要认真啊!

  改出错误后,编译通过,测试案例部分通过,[0,2,3,4,6] 不通过,这个案例没有特别特殊的,却没有通过,分析之后发现,在第二次for循环统计间隔大小时迭代器从开始起,间隔会把2和0的算进去,0可以做任何数,是不能算进去的,所以这里红色的不要。 而且++iter不能去,因为计算的时候使 - *(iter -1) ,如果加一下iter还是会把 和0的间隔算进去! 哎,一个小问题改两道,先分析不能 慌忙测试。

   最后一个错误,乃是对特殊输入的测试,如果输入为空我没有处理,会返回true,事实我们应该返回false。所以应该再加一个判断

 if( numbers.begin() == numbers.end() ) return false ;  才算完美。

   编程前先想清楚流程,代码码好后,不能着急测试,检查一遍之后再 运行。

你可能感兴趣的:(牛客网 剑指offer系列 错题记录一)