C++求解1~n范围重复与缺失数字代码报错排查
代码错误点
- 动态内存分配错误:
int *res=new int(2);语法含义是分配1个int类型内存并赋值为2,并非分配长度为2的int数组。访问res[1]属于越界访问非法内存,值不确定,这是你得到输出0的直接原因之一。 - 哈希数组长度不足:你定义的
int hsh[n]长度为n,下标范围为0n-1,而你需要统计1n的数字出现次数,当数字等于n时,hsh[arr[i-1]]会越界访问,无法正确统计最大值n的出现次数,也无法检测到n是否缺失,这是你测试用例中14未被识别为缺失值的核心原因。 - 变量未初始化:
int mini;未赋值就调用min(mini,i)属于未定义行为,取值完全随机。且本题保证1~n范围内仅有1个重复值,mini的最小比较逻辑完全多余。 - 合规性问题:C++标准不支持变长数组
int hsh[n]写法,仅部分编译器做了扩展支持,代码兼容性差。
修复后代码
int *findTwoElement(int *arr, int n) { // 正确分配长度为2的动态数组 int *res = new int[2]; // 哈希数组长度设为n+1,覆盖1~n所有下标,初始化全为0 int *hsh = new int[n+1](); for(int i = 0; i < n; i++) { hsh[arr[i]]++; } for(int i = 1; i <= n; i++) { if(hsh[i] > 1) { res[0] = i; } if(hsh[i] == 0) { res[1] = i; } } // 释放临时哈希数组,避免内存泄漏 delete[] hsh; return res; }
注意:调用方使用完返回的res数组后,需要调用
delete[] res释放内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者magician99
相关产品推荐
相关产品推荐

