题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
分析:
1、分析判断输入数组的合法性;
2、寻找出现次数超过数组长度一半的数字;
3、检查寻找的数字是否超过数组长度的一半;
完整代码:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
//检查输入的合法性
if(numbers.empty())
return 0;
/*******寻找超过数组长度一半的数字*******/
//获取容器的大小
int length = numbers.size();
//获取比较的数字
int result = numbers[0];
//数字出现的次数
int times = 1;
//遍历容器里的元素
for (int i = 1; i < length - 1; ++i)
{
//判断当前的数字是否为0
if(times == 0)
{
//重新设置比较的数字
result = numbers[i];
//重置次数为1
times = 1;
}
//如果不为 0 的话,则比较下一个元素与比较元素是否相等
else if(numbers[i] == result)
//次数+1
times++;
else
//次数-1
times--;
}
//确认寻找到的数字是否为数组长度的一半
if(!CheckMoreThanHalf(numbers, length, result))
return 0;
//返回最终的结果
return result;
}
private:
bool CheckMoreThanHalf(vector<int> &numbers, int length, int result)
{
//声明一个变量,用来表示次数并初始化为0
int times = 0;
//遍历容器里的元素
for(int i = 0; i < length; ++i)
{
//计算result在容器中出现的次数
if(result == numbers[i])
times++;
}
//声明一个布尔类型的变量,用来做标志
bool MoreThanHalf = false;
//判断result是否大于数组长度一半
if(times * 2 > length)
MoreThanHalf = true;
return MoreThanHalf;
}
};
相关知识点:
(1)、if-else if-else的执行顺序:
(2)、else 永远与最近的 if 相匹配;
(3)、if 与 if 之间的关系是并列关系,按照顺序执行;
(4)、if 与 else if 之间的关系是分支关系,当满足 if 条件之后,else if 语句不再执行;