总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目:
扑克牌中的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。其中A为1,J为11,Q为12,K为13,而大小王为0,且大小王能够当做任意一张牌。
解题思路:
1.首先应该对数组进行排序。
2.统计数组中大小王(0)出现的个数。
3.统计数组中所有相邻数之间的间隔。
4.同时还需要排除对子的情况,如果出现了对子,那么肯定不可能是顺子(0除外)。
5.最后比较0的个数和间隔大小,如果0的个数大于等于间隔数,说明可以组成顺子。
可以AC的解法【C++版本】
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> data{ 5,7,6,0,4 };
if (IsContinuous(data)) {
cout << "is continuous."<< endl;
}
else {
cout << "You don't get lucky." << endl;
}
system("pause");
return 0;
}
bool IsContinuous(vector<int> numbers) {
if (numbers.size() != 5)return false;
sort(numbers.begin(), numbers.end());
int numOfZero = 0;
//统计0的个数
for (int i = 0; i != 5; i++) {
if (!numbers[i])
numOfZero++;
}
int beg = numOfZero+1;
int numOfGap = 0;
while (beg < 5) {
//如果出现了对子,那么肯定不可能是连子
if (numbers[beg - 1] == numbers[beg])
return false;
numOfGap += numbers[beg] - numbers[beg - 1] -1;
beg++;
}
return (numOfZero >= numOfGap) ? true : false;
}