剑指offer-扑克牌顺子

    xiaoxiao2022-07-02  94

    39.

    题目内容:

    代码及思路:

    首先根据这么长的题目,可以提取出的关键信息是:

    1.五张牌可以看做是一个5个数字构成的数组

    2.大小王可以是任意数字(用0来表示)

    3.如果是顺子,最直观的方法就是对数据进行排序,用0去填充的空缺,如果相邻两个数字相隔若干个数字,那么只要有足够的0就可以补满空缺的位置。

    所以将问题就可以转为以下几个步骤:1.对数组进行排序;2.计算0的个数;3.计算空缺的个数。

    如果0的个数等于空缺的个数,则认为是顺子,反之则不是。

    #include<iostream> #include<vector> using namespace std; class Solution { public: bool IsContinuous(vector<int> numbers) { if (numbers.empty()) return false; int* data = &numbers[0]; Quicksort(data, 0, numbers.size() - 1); int numof0 = 0; //统计0的个数 for (int i = 0; i < numbers.size() && numbers[i] == 0; i++) numof0++; int numofgap = 0; //统计空缺数 int small=numof0; int big = small + 1; while (big < numbers.size()) { //如果出现两个相等的数字就肯定不是顺子 if (numbers[small] == numbers[big]) return false; numofgap += numbers[big] - numbers[small] - 1; small = big; big++; } if (numof0 == numofgap) return true; else return false; } void Quicksort(int* data, int low, int high) { if (low > high) return; int left = low; int right = high; int key = data[left]; while (left != right) { while (left != right&&data[right] > key) right--; data[left] = data[right]; while (left != right&&data[left] < key) left++; data[right] = data[left]; } data[left] = key; Quicksort(data, low, left - 1); Quicksort(data, left + 1, high); } }; void main() { Solution* object = new Solution; vector<int> numbers; int num; char ch; do { cin >> num; numbers.push_back(num); cin.get(ch); } while (ch == ','); bool res = object->IsContinuous(numbers); cout << res << endl; }

     

    最新回复(0)