这道题目由于不容易写测试用例,所以,可以把题目转换为:在一个数组中,有一个数字出现的次数超过了数组大小的一半,这和题目原意是一样的。
这道题目的思想是我们同时去掉数组中两个不一样的数字,那么,数组中原来存在的规律是不变的(仅针对这个题目)。
好吧,还是先给出函数声明:
/*2.3 寻找发帖水王*/ bool DutVerify(int*, int, int); int DutFindNumMoreThanHalf(int*, int);
由于注释都已经写在了代码里,这里不多做解释,贴代码吧:
/*验证有效函数*/ bool DutVerify(int* A, int size, int result) { /*出现的次数*/ int count = 0; for (int i = 0; i < size; ++i) { if (A[i] == result) ++count; } /*验证出现的次数是否大于数组长度的一半*/ if (count > (size / 2)) return true; else return false; } /*这个题目转换为数组中存在某一个数,这个数出现的次数大于数组中元素个数的一半*/ /*全局变量标识输入参数是否有效*/ bool _DutFindNumMoreThanHalf = false; int DutFindNumMoreThanHalf(int* A, int size) { if (!A || size <= 0) { _DutFindNumMoreThanHalf = true; return -1; } int result; int count = 0; /* *这里的思想是同时去掉两个不一样的数字,那么数组的“原型”不会改变, *即大于一半的那个数字在当前的数组中还是大于当前个数的一半 */ for (int i = 0; i < size; ++i) { if (count == 0) { result = A[i]; ++count; } else { if (result == A[i]) ++count; else --count; } } /*当得到这个数字之后,我们需要验证这个数字是否出现的次数大于总个数的一半*/ bool res = DutVerify(A, size, result); if (res == true) return result; else { _DutFindNumMoreThanHalf = true; return -1; } }
原文地址:http://blog.csdn.net/dlutbrucezhang/article/details/39548933