【问题标题】:Can you help me with a deleting duplicated values in an array c++ challenge?您能帮我删除数组 C++ 挑战中的重复值吗?
【发布时间】:2018-10-24 19:52:40
【问题描述】:

挑战在于编写一个删除数组重复值的程序。

#include <iostream>
using namespace std;

void func(int arrayA[], int n, int arrayB[]) {
    int h = 0;
    int count = 0;
    arrayB[0] = arrayA[0];
    for (int i = 1; i < n; i++) {
        count = 0;
        for (int j = 0; j < n; j++) {
            if (arrayB[i] == arrayA[j]) {
                count++;
            }
        }
        if (count == 0) {
            h++;
            arrayB[h] = arrayA[i];
        }
    }
}
int main() {
    int n;
    cin >> n;
    int arrayA[n];
    int arrayB[n];
    for (int i = 0; i < n; i++) {
        cin >> arrayA[i];
    }
    func(arrayA, n, arrayB);
    for (int i = 0; i < n; i++) {
        cout << arrayB[i] << endl;
    }
}

我的逻辑是创建一个新数组并用非重复值填充它,为此我创建了一个循环,当它找到重复值时将 1 添加到计数器,如果计数器等于 0,则添加该值。然后计数器重新启动。

感谢您对新程序员的帮助,我真的试图自己解决这个问题。

【问题讨论】:

  • int arrayA[n]; 不是有效的 C++ - 数组维度必须是编译时常量。
  • 提示:做一个简单的输入来暴露不当行为。然后处理你的代码并建立一个期望表。您期望在每一行代码中发生什么?如果构建表格不会使错误松动,请使用调试器逐行执行程序,并注意程序在哪里执行了您未预料到的操作。赔率很好,这是一个错误,如果不是,那就是您的期望中的错误。在继续之前,两者都需要修复。
  • 注意:如果要消除重复,arrayB 的有效内容很可能比arrayA 少。
  • 顺序重要吗?如果不是,则颠覆问题,将数据存储在一个集合中,然后输出。

标签: c++ arrays


【解决方案1】:

使用std::vector

如果您想偷懒,请尝试查看此example。您可以执行以下操作(未测试):

std::vector<int> func(int a[], int size_a){
    std::vector<int> vec_a(a, a + size_a); 
    std::sort(vec_a.begin(), vec_a.end()); 
    std::vector<int> ordered_vec_a = std::unique(vec_a.begin(), vec_a.end()); 
    vec_a.erase(ordered_vec_a, vec_a.end()); 
    return ordered_vec_a;
}

“硬核”C++

如果你想解决你的问题,并继续你的解决方案,使用更“原始”的方法,你需要确保返回的数组正好唯一的数量数组a 中的元素。

所以,首先,获取a 的唯一元素的数量,看看这个answer。之后,您可以创建输出数组,b

int b = new int[size_calc_from_post]
//do stuff here.
delete[] b; // make sure to delete! 
b = NULL; 

【讨论】:

  • 没有C/C++语言。
  • C 语言没有newdelete
  • @ThomasMatthews 这就是为什么我将其标记为C/C++。我将其更改为C++