C++结构体成员默认初始化失效问题求助(LeetCode 1207)
解答:结构体成员未初始化及代码逻辑问题修复
核心问题:count未初始化为0的原因
你在结构体里写int count = 0是C++的类内成员初始化语法,但使用malloc()分配内存时,malloc仅从堆上分配一块原始未初始化内存,不会触发结构体构造函数,也不会执行类内初始化操作。因此count成员会保留内存中的原有垃圾值,无法自动变为0。
解决方法
有两种方式修复初始化问题:
- 改用C++的
new运算符,它会自动调用结构体构造函数完成成员初始化:
Occurence *Array = new Occurence[N];
- 若坚持使用
malloc,需手动遍历数组为每个元素的count赋值0:
Occurence *Array = (Occurence*)malloc(N*sizeof(Occurence)); for(int i=0; i<N; i++){ Array[i].count = 0; }
代码中其他关键错误
除初始化问题外,你的代码还有多处逻辑错误,导致无法正确解决LeetCode 1207问题:
1. IN函数逻辑错误
当前IN函数仅检查数组第一个元素,不匹配就直接返回false,未遍历整个数组。正确写法需遍历完所有元素后,确认无匹配才返回false:
bool IN(Occurence Arr[], int var, int size){ for(int i=0; i<size; i++){ if(var == Arr[i].element){ return true; } } return false; }
2. count_Occurence函数逻辑错误
当元素存在时,你递增的是Array[i].count,但此处的i是原数组的遍历索引,对应的Array[i]并非存储该元素的位置。正确逻辑应为:找到数组中存储目标元素的Occurence对象再递增count;未找到则在有效位置添加新元素(需维护有效元素数量):
void count_Occurence(Occurence Array[], int Arr[], int size, int& len){ len = 0; // 初始有效元素数为0 for(int i=0; i<size; i++){ int Var = Arr[i]; bool found = false; // 遍历已有的有效元素 for(int j=0; j<len; j++){ if(Var == Array[j].element){ Array[j].count++; found = true; break; } } if(!found){ // 添加新元素到有效位置 Array[len].element = Var; Array[len].count = 1; len++; } } }
3. 主函数判断唯一出现次数的逻辑错误
用异或ans = ans ^ Array[i].count无法正确判断出现次数是否唯一(例如三个相同次数的异或结果会等于该次数,但实际已重复)。正确做法是用集合存储出现次数,比较集合大小与有效元素数量是否相等:
#include<iostream> #include<unordered_set> using namespace std; typedef struct Occurence{ int element; int count = 0; }Occurence; // 此处放入修正后的IN和count_Occurence函数 int main(){ int Arr[1000]; int N; cin >> N; for(int i=0; i<N; i++){ cin >> Arr[i]; } Occurence *Array = new Occurence[N]; int len; count_Occurence(Array, Arr, N, len); unordered_set<int> cnt_set; bool unique = true; for(int i=0; i<len; i++){ if(cnt_set.count(Array[i].count)){ unique = false; break; } cnt_set.insert(Array[i].count); } cout << (unique ? "true" : "false") << endl; delete[] Array; // 释放new分配的内存 return 0; }
内容的提问来源于stack exchange,提问作者RACHIT MITTAL
相关产品推荐
相关产品推荐

