題目:從撲克牌中隨機抽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;
}
};