例如输入一个长度为 9 的数组 {1,2,3,2,2,2,5,4,2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2。如果不存在则输出 0。
遍历统计,记录每个元素出现的次数,然后找出出现次数超过一半的那个数
int traverseEach(int *array,int number) {
int *tempArray = (int *)malloc(sizeof(int)*(number / 2 + 1) * 2);
//全部初始化为0
for (int i = 0; i < number * 2; i ++) {
tempArray[i] = 0;
}
int maxNumber = 0;
int returnValue = 0;
int maxCount = 0;
int tempIndex = 0;
for (int i = 0; i < number; i ++) {
tempIndex = 0;
if (maxCount == 0) {
//初始化一下
tempArray[maxCount] = array[i];
tempArray[number + i] = 1;
maxCount = 1;
} else {
//
for (; tempIndex < maxCount; tempIndex ++) {
if (tempArray[tempIndex] == array[i]) {
tempArray[number + tempIndex] += 1;
break;
}
}
if (tempIndex == maxCount) {
//新的
tempArray[tempIndex] = array[i];
tempArray[number + tempIndex] += 1;
maxCount += 1;
}
}
if (maxNumber < tempArray[number + tempIndex]) {
maxNumber = tempArray[number + tempIndex];
returnValue = tempArray[tempIndex];
}
}
free(tempArray);
//检验是否大于一半
if (maxNumber <= number/2) {
returnValue = 0;
}
return returnValue;
}
这里是用 C 实现
能不能来个简单一点的方法?
可以进行排序,因为这个数出现次数超过了一半,所以中间那个数肯定就是要求的了
void maopSort(int *array,int number) {
int changed = 1;
for (int i = number - 1; i > 0 ; i --) {
if (changed == 0) {
break;
}
changed = 0;
for (int j = 0; j < i; j++) {
if (array[j] > array[j+1]) {
//exchange
array[j] += array[j+1];
array[j+1] = array[j] - array[j+1];
array[j] = array[j] - array[j+1];
changed = 1;
}
}
}
}
int sortRelu(int *array, int number){
maopSort(array, number);
return array[number/2];
}
这里是用 C 实现
那万一这个数没有出现一半呢?怎么办?
那遍历时,进行比较,从列表中移除两个不相等的数字,一直到只剩下最后一个数,那个数就是所求
int neutralize(int *array,int number) {
int returnValue = array[0];
int count = 1;
for (int i = 1; i < number; i ++) {
if (returnValue == array[i]) {
count += 1;
} else {
count -= 1;
}
if (count <= 0) {
count = 1;
returnValue = array[i];
}
}
return returnValue;
}
这里是用 C 实现