7/10 题目:扑克牌顺子 ,看过剑指offer的一定知道这道题,当时看过了觉得蛮简单,过了几天,在牛客网选这题做的时候却没有一次编译通过,错误都是细节的,好记性不如烂笔头,所以写在这里记录下,希望能够温故知新。
凭着理解和记忆,第一次的代码如下
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
sort(numbers.begin() ,numbers.end());
vector<int>::iterator iter = numbers.begin();
int numOfZero = 0;
int numOfGap = 0;
for(;iter < numbers.end() && (*iter) == 0 ;++<span style="color:#ff0000;"> iterator</span>)
{
numOfZero ++ ;
}
<span style="color:#ff0000;">iter = numbers.begin();</span>
++ 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 ; 才算完美。
编程前先想清楚流程,代码码好后,不能着急测试,检查一遍之后再 运行。