C++求解数组元素配对数量代码输出异常问题排查求助
问题诊断与修复方案
核心错误原因
- 未初始化的
arr1遍历范围错误arr1用于存储已经统计过的唯一元素,仅前k个位置是有效存储值,剩余空间未初始化是随机垃圾值。原代码遍历整个长度为n的arr1做存在性判断,不仅会因为随机值导致判断错误,同时exist变量在匹配到已存在元素后没有及时重置为false,会导致后续所有元素都被误判为已处理,不再统计。 - 内外层循环变量同名冲突
统计元素出现次数的内层循环复用了外层的变量i,会直接篡改外层循环的计数,导致外层遍历跳过大量元素,统计结果完全错误。 - 额外兼容性问题:代码使用了C++标准不支持的变长数组(VLA),属于GCC等编译器的扩展实现,跨平台运行会出错。
修复后代码
#include <iostream> #include <vector> using namespace std; void sockMerchant(int arr[],int n){ // 用vector替代变长数组,自动初始化 vector<int> processed; int pairs=0; for(int i=0;i<n;i++){ bool exist = false; // 只遍历已存储的有效元素 for(int j=0;j<processed.size();j++){ if(processed[j]==arr[i]){ exist = true; break; // 找到就提前退出,不需要继续遍历 } } if(!exist){ int c=0; int x = arr[i]; // 内层循环用独立变量m,避免和外层i冲突 for(int m=0;m<n;m++){ if(arr[m]==x){ c++; } } processed.push_back(x); pairs += c/2; } } cout << pairs; } int main() { int n; cin >> n; int* arr = new int[n]; for(int i=0;i<n;i++){ cin >> arr[i]; } sockMerchant(arr,n); delete[] arr; return 0; }
修复后的代码运行给定测试输入,输出结果为4,符合预期。
内容的提问来源于stack exchange,提问作者Vtechster
相关产品推荐
相关产品推荐

