数据结构-剑指offer-扑克牌中的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看作任意数字。

思路:首先把数组排序,其次统计数组中0的个数;最后统计排序之后的数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。

代码1:使用sort全排序,对数组进行排序,然后统计0的个数,计算相邻数字之间的总空缺数,并比较0的个数和总空缺数。报错:只通过了一部分的测试用例,以[0,3,2,6,4]为例,应该输出true,而我的代码输出为false。出错原因:如果有一个元素为0的话,下一个不应该跟0求差值,所以两个判断语句之间的关系应该是if-else。

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size() == 0) return false
        sort(numbers.begin(),numbers.end());
        int count = 0;
        int zeroCount = 0;
        if(numbers[0] == 0)
            zeroCount++;
        for(int i=1;i<numbers.size();i++){
            if(numbers[i] == 0)
                zeroCount++;
            if(numbers[i] == numbers[i-1])
                return false;
            else
                count += numbers[i] - numbers[i-1] - 1;
        }
        if(count <= zeroCount)
            return true;
        else
            return false;
    }
};

改进后的代码:

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size() == 0) return false;
        sort(numbers.begin(),numbers.end());
        int count = 0;
        int zeroCount = 0;
        //统计数组中0的个数
        //for(int i=0;i<numbers.size() && numbers[i] == 0;i++){
            //zeroCount++;
        //}
        for(int i=0;i<numbers.size();i++){
            if(numbers[i] == 0)
                zeroCount++;
            else{
                if(i+1<5){
                    if(numbers[i] == numbers[i+1])
                        return false;
                    else
                        count += numbers[i+1] - numbers[i] -1;
                }
            }
        }
        if(count <= zeroCount)
            return true;
        else
            return false;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章