You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++结构体成员默认初始化失效问题求助(LeetCode 1207)

解答:结构体成员未初始化及代码逻辑问题修复

核心问题:count未初始化为0的原因

你在结构体里写int count = 0是C++的类内成员初始化语法,但使用malloc()分配内存时,malloc仅从堆上分配一块原始未初始化内存,不会触发结构体构造函数,也不会执行类内初始化操作。因此count成员会保留内存中的原有垃圾值,无法自动变为0。

解决方法

有两种方式修复初始化问题:

  1. 改用C++的new运算符,它会自动调用结构体构造函数完成成员初始化:
Occurence *Array = new Occurence[N];
  1. 若坚持使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:39:36