如何防止检查数组中的重复元素?

How do I prevent checking of duplicate elements in a array?

提问人:NORAGAMI 提问时间:10/30/2023 最后编辑:Vlad from MoscowNORAGAMI 更新时间:10/31/2023 访问量:70

问:

我正在检查数组中每个元素的频率。问题是重复元素的计数超出了需要,我想跳过已经计数的元素的计数过程。

    for (int x = 0; x < n; x++) {
        bird = all[x];
        for (int y = 0; y < n; y++) {
            if (all[x] == all[y]) {
                status[bird - 1]++; 
            }
        }
    }

示例输入 - 我想要输出 - 但我得到输出 -


1 1 2 2 32 2 1 0 04 4 1 0 0

status[]保持元素的频率。 只有 5 个索引,并且输入范围仅在 1 到 5 之间。status[]all[]

在这里,1 at 再次计算自己的频率,但我不希望这样。x = 1

是否有在不增加代码复杂性的情况下跳过重复元素的逻辑?

数组 C 重复 嵌套循环频率

评论

1赞 Some programmer dude 10/30/2023
编辑您的问题,以包含一个最小的可重现示例。对函数中的“输入”进行硬编码。main
0赞 chux - Reinstate Monica 10/30/2023
@NORAGAMI,如果输入是,你还需要输出吗?1 2 2 3 12 2 1 0 0
0赞 ikegami 10/30/2023
@chux - 恢复莫妮卡,2x,2x,1x,0x,0x(2 2 1 0 0)。 不是法律输入(“仅在 1 到 5 的范围内”)。123451 3 10 10 3
0赞 chux - Reinstate Monica 10/30/2023
@ikegami我希望OP做出回应。对不起,我第一次没有编辑@NORAGAMI
0赞 ikegami 10/30/2023
标签或缺少标签不会影响答案。

答:

1赞 ikegami 10/30/2023 #1

你只需要

for ( size_t i = 5; i--; )
   status[ i ] = 0;

for ( size_t i = n; i--; )
   ++status[ all[ i ] - 1 ];

评论

0赞 NORAGAMI 10/31/2023
谢谢,这很有帮助!
2赞 nielsen 10/30/2023 #2

代码假定值范围为 。在这种情况下,您可以简单地为每个值增加相应的计数器:1n

// Reset all counters. This can be skipped if "status" is initialized to all zeroes {0}
// The code below assumes "status" is an array. Otherwise, the count must
// be the length (in case of the OP, this is 5).
for(int x=0; x < sizeof(status)/sizeof(status[0]); x++) {
    status[x] = 0;
}

// Count each occurrence. If elements of "all" may be out of range, a range check
// must be added.
for(int x=0; x<n; x++) {
    status[all[x]-1]++;
}
1赞 Vlad from Moscow 10/30/2023 #3

例如,仅使用一个 for 循环就足够了

for ( int x = 0; x < n; x++ ) {
    bird = all[x];
    status[bird-1]++;
}  

评论

0赞 NORAGAMI 10/31/2023
谢谢,这很有帮助!
0赞 Vlad from Moscow 10/31/2023
@NORAGAMI完全没有。不客气:)