数组长度的计算
int a[] = {1,1,1,1,1,1,1,1};
int len = sizeof(a)/sizeof(int);
sizeof(a)
函数计算a
的字节数,sizeof(int)
函数计算int
类型的字节数,因此两数相除才是数组a
的长度。
循环遍历数组
与字符串不同,数组的遍历不能使用p++
的方式,否则无法正确终止循环。
例如:
#include<stdio.h>
int numMorethanHalf(int *a) {
int count = 0;
while(a != NULL) {
count++;
a++;
}
return count;
}
void test1() {
int a[] = { 1,3,4,8,2,3,3,3 };
int result = numMorethanHalf(&a);
printf("%d\n", result);
}
int main() {
test1();
}
此代码使程序陷入死循环,无法结束。也就说明a != NULL
恒成立。
解决上述两个问题后,就可以写该问题的核心代码:
int numMorethanHalf(int *a,int len) {
if ((a == NULL) || (len <= 0))
return -1;
int result = a[0];
int count = 1;
for (int i = 0; i < len - 1;i++) {
if (result == a[i+1]) {
count++;
}
else if( (result != a[i + 1]) && (count > 1) ){
count--;
}
else{
result = a[i + 1];
count = 1;
}
}
count = 0;
for (int i = 0; i < len; i++) {
if (a[i] == result)
count++;
}
if (count * 2 < len)
return -2;
return result;
}
测试函数:
void test1() { //存在超过数组长度一半的数字
int a[] = { 1,3,4,8,2,3,3,3 };
int len = sizeof(a) / sizeof(int);
int result = numMorethanHalf(&a,len);
printf("%d\n", result);
}
void test2() { //不存在超过数组长度一半的数字
int a[] = { 1,3,4,8,2,2,3,3 };
int len = sizeof(a) / sizeof(int);
int result = numMorethanHalf(&a, len);
printf("%d\n", result);
}
void test3() { //指针为空
int result = numMorethanHalf(0, 0);
printf("%d\n", result);
}
void test4() { //超过数组长度一半的数字在前半段
int a[] = { 1,1,1,1,1,2,3,3,4};
int len = sizeof(a) / sizeof(int);
int result = numMorethanHalf(&a, len);
printf("%d\n", result);
}
void test5() { //超过数组长度一半的数字在后半段
int a[] = { 1,0,4,8,3,3,3,3,3 };
int len = sizeof(a) / sizeof(int);
int result = numMorethanHalf(&a, len);
printf("%d\n", result);
}
主函数:
int main() {
test1();
test2();
test3();
test4();
test5();
}
运行结果: