输入给一个长度为n的数组,数组中有一个数字出现的次数超过数组长度的一半,请我出这个数字、用c语言实现
时间: 2024-10-11 08:06:36 浏览: 26
PHP实现找出数组中出现次数超过数组长度一半的数字算法示例
在C语言中,要找出一个长度为`n`的数组中出现次数超过一半的数字,可以使用哈希表(如`unordered_map`在C++中,但在C语言里我们可以手动实现类似的功能)或者使用线性扫描结合计数的方法。这里我们使用后者,即遍历数组并同时更新每个元素出现的次数,然后再次遍历数组查找第一个达到或超过数组长度一半次数的元素。
```c
#include <stdio.h>
int majorityElement(int arr[], int n) {
if (n == 0) return -1; // 防止空数组
int candidate = arr[0], count = 1;
for (int i = 1; i < n; i++) {
if (arr[i] == candidate)
count++;
else
count--;
if (count == 0) { // 更新候选元素
candidate = arr[i];
count = 1;
}
}
// 再次检查最后的候选元素是否超过一半
count = 0;
for (int i = 0; i < n; i++)
count += (arr[i] == candidate);
return (count > n / 2) ? candidate : -1;
}
int main() {
int arr[] = {2, 2, 1, 3, 2, 2};
int n = sizeof(arr) / sizeof(arr[0]);
int result = majorityElement(arr, n);
if (result != -1)
printf("Majority element is %d\n", result);
else
printf("No majority element found.\n");
return 0;
}
```
在这个例子中,`majorityElement`函数首先假设第一个元素作为候选数,并计算它的计数。然后它遍历整个数组,如果遇到相同的元素,计数加一;否则,减一。如果计数变为零,则更换当前候选数。最后再检查候选数在整个数组中的实际出现次数,如果大于一半则返回,否则返回-1表示没有找到满足条件的元素。
阅读全文