如何修改C++数组代码,实现仅打印重复出现的元素一次?
实现仅输出数组中重复元素且每个仅打印一次
原代码存在两个问题:一是内层循环j <= ARRAY_SIZE会导致数组越界(数组下标范围是0到ARRAY_SIZE-1),二是找到重复元素就直接打印,导致同一个重复元素被多次输出。以下是两种符合需求的修改方案:
方案一:计数+标记法
通过计数数组统计元素出现次数,再用标记数组避免重复打印:
#include <iostream> using namespace std; int main() { const int ARRAY_SIZE = 10; int value[ARRAY_SIZE] = { 1, 2, 3, 4, 3, 4, 2, 3, 5, 6}; int count[100] = {0}; // 假设元素值范围在0-99之间,用于统计出现次数 bool printed[100] = {false}; // 标记元素是否已打印 // 统计每个元素的出现次数 for (int i = 0; i < ARRAY_SIZE; i++) { count[value[i]]++; } // 遍历数组,输出符合条件的元素 for (int i = 0; i < ARRAY_SIZE; i++) { if (count[value[i]] > 1 && !printed[value[i]]) { cout << value[i] << " "; printed[value[i]] = true; // 标记为已打印,避免重复输出 } } return 0; }
方案二:直接检查重复+标记法
不需要额外计数,直接检查当前元素是否有重复,同时标记已打印的元素:
#include <iostream> using namespace std; int main() { const int ARRAY_SIZE = 10; int value[ARRAY_SIZE] = { 1, 2, 3, 4, 3, 4, 2, 3, 5, 6}; bool printed[100] = {false}; // 标记元素是否已打印 for (int i = 0; i < ARRAY_SIZE; i++) { if (printed[value[i]]) // 已打印过的元素直接跳过 continue; bool hasDuplicate = false; // 检查当前元素后面是否有重复项 for (int j = i + 1; j < ARRAY_SIZE; j++) { if (value[i] == value[j]) { hasDuplicate = true; break; // 找到重复即可停止检查 } } if (hasDuplicate) { cout << value[i] << " "; printed[value[i]] = true; } } return 0; }
两种方案都能输出2 3 4,解决了原代码的问题。如果元素值范围较大,可以改用std::unordered_map来计数和标记,不过对于简单场景,数组实现更直观高效。
内容的提问来源于stack exchange,提问作者Huy Trần
相关产品推荐
相关产品推荐

