题目描述
民警侦办某商场店面盗窃案时,通过人脸识别针对嫌疑人进行编号1-100000。
现在民警在监控记录中发现某个嫌疑人在被窃店面出现的次数超过了所有嫌疑人总出现次数的一半,请帮助民警尽可能高效的找到该嫌疑人的编号。
输入:给定一个嫌疑人的标号数组men,其中 1<length(men)< 1000,嫌疑人编号满足1<= men <= 100000
输出:返回出现次数超过一半的嫌疑人的编号。
如果总次数是偶数,例如4,则需要超过2次即最少3次,如果总次数是奇数,例如5,则需要超过2.5,满足条件最少是3次。
若没有嫌疑人满足该条件,返回0
实例1
输入:
1,2,3,2,2
输出:
2
解释:
第一行是嫌疑人出现记录,代表1号和3号嫌疑人出现1次,2号嫌疑人出现3次,因为2号嫌疑人出现3次,超过5次的一半,因此2号嫌疑人即为需要寻找的编号,输出2
实例2
输入:
1,1,2,2,3,3
输出:
0
解释:
第一行是嫌疑人出现记录,代表1号、2号和3号嫌疑人各出现2次因为各个嫌疑人均只出现2次,未超过6次的一半,因此没有嫌疑人满足要求,输出0
C语言解题代码
#include <stdio.h>
#include <string.h> // 包含string.h头文件
#include <stdlib.h> // 包含stdlib.h头文件
int findSuspect(int men[], int n) {
int count[100001] = {0}; // 初始化一个计数数组,下标范围为1到100000
for (int i = 0; i < n; i++) {
count[men[i]]++; // 统计每个嫌疑人的出现次数
if (count[men[i]] > n / 2) { // 如果某个嫌疑人的出现次数超过了总次数的一半
return men[i]; // 返回该嫌疑人的编号
}
}
return 0; // 如果没有找到符合条件的嫌疑人,返回0
}
int main() {
int men[1000]; // 假设最多输入1000个嫌疑人的编号
int n = 0; // 记录实际输入的嫌疑人数量
char input[10000]; // 假设输入的数字总长度不超过10000
printf("请输入嫌疑人的标号:");
fgets(input, sizeof(input), stdin); // 读取一行输入
char *token = strtok(input, ","); // 使用逗号分隔输入的数字
while (token != NULL) {
men[n++] = atoi(token); // 将字符串转换为整数存入数组
token = strtok(NULL, ",");
}
int result = findSuspect(men, n); // 调用findSuspect函数查找出现次数超过一半的嫌疑人的编号
printf("出现次数超过一半的嫌疑人的编号是:%d\n", result); // 打印找到的嫌疑人的编号
return 0;
}
详细解释(具体到每行)
#include <stdio.h> //包含标准输入输出库,提供了输入输出函数的定义
#include <string.h> //包含字符串处理库,提供了字符串处理函数的定义
#include <stdlib.h> //包含标准库,提供了内存分配、类型转换等函数的定义
int findSuspect(int men[], int n) {//定义了名为findSuspect的函数,接受整型数组men和整数n作为参数,返回一整数
int count[100001] = {0}; //定义一个长度为100001的整型数组count,并初始化所有元素为0。数组用来统计每个嫌疑人的出现次数
for (int i = 0; i < n; i++) {//for循环遍历从0到n-1的所有索引
count[men[i]]++; //统计嫌疑人men[i]出现的次数,对应的计数数组加一
if (count[men[i]] > n / 2) { // 如果某个嫌疑人的出现次数超过了总次数的一半
return men[i]; // 返回该嫌疑人的编号
}
}
return 0; // 如果没有找到符合条件的嫌疑人,返回0
}
int main() { //定义主函数
int men[1000]; //定义一个长度为1000的整型数组men,用来存储嫌疑人的编号
int n = 0; //初始化一个整数n,用来记录实际输入的嫌疑人数量
char input[10000]; //定义一个长度为10000的字符数组input,用来存储输入的数字
printf("请输入嫌疑人的标号:");
fgets(input, sizeof(input), stdin); //从标准输入流中读取一行输入,存储在input中
char *token = strtok(input, ","); //使用逗号分隔输入的数字,strtok函数用于分割字符串
while (token != NULL) { //当分割结果不为空时,进入循环
men[n++] = atoi(token); //将分割出来的字符串转换为整数,并存入men数组中
token = strtok(NULL, ",");//继续分割下一个字符串
}
int result = findSuspect(men, n); //调用findSuspect函数,传入嫌疑人数组和数量,查找出现次数超过一半的嫌疑人编号
printf("出现次数超过一半的嫌疑人的编号是:%d\n", result); // 打印找到的嫌疑人的编号
return 0;//主函数返回0,表示程序正常结束
}
运行结果