用c语言 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
时间: 2024-12-23 07:16:43 浏览: 3
在C语言中,我们可以使用线性扫描的方法结合哈希表(也称为计数排序的思想)来解决这个问题。这种方法不需要额外的空间,只需要常数级别的辅助空间,遍历数组一次即可找到目标数字。下面是一个基本的步骤:
1. 初始化一个大小为`n+1`的整型数组`count`,用于存储每个数字出现的次数,数组下标表示数字本身,值初始为0。
2. 遍历输入数组`arr[]`,对于每个元素`arr[i]`:
- 将`count[arr[i]]`加1。
3. 找到第一个大于或等于`n / 2`的元素索引`index`,因为数组下标从0开始,所以`arr[index]`就是出现次数超过一半的数字。如果所有元素的计数都不满一半,则说明不存在这样的数字,返回-1作为结果。
下面是C语言的示例代码:
```c
#include <stdio.h>
#include <limits.h>
int findMajorityElement(int arr[], int n) {
int count[INT_MAX + 1] = {0}; // 初始化计数数组
for (int i = 0; i < n; ++i) {
count[arr[i]]++;
}
for (int index = 0; index < INT_MAX; index++) {
if (count[index] >= n / 2) {
return index;
}
}
return -1; // 没有出现次数超过一半的数字
}
int main() {
int arr[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};
int n = sizeof(arr) / sizeof(arr[0]);
int result = findMajorityElement(arr, n);
if (result != -1)
printf("The majority element is: %d\n", result);
else
printf("No majority element found.\n");
return 0;
}
```
注意,这个方法假设数组中的元素是非负整数,并且不会超出`INT_MAX`。如果存在负数或者大整数,你需要修改`count`数组的大小和边界检查。
阅读全文