c ++中的数字不同

时间:2014-08-31 00:41:57

标签: c++ arrays

我想首先说我是编程新手。我在c ++中从另一个列表中编写不同数字列表时遇到问题。假设我有一个列表l1 = {1, 12, 2, 4, 1, 3, 2},我想创建一个类似于l2 = {1, 12, 2, 4, 3}的新列表......

这就是我写的:

#include <iostream>

using namespace std;

int main() {
    int l1[100], l2[100], length, length1 = 0, i, j, a = 0;
    cin >> length; //set the length
    for (i = 0; i < length; i++) {
        cin >> l1[i]; //add numbers to the list
    }
    l2[0] = l1[0]; //added the first number manually
    for (i = 0; i < length; i++) {
        length1++;
        a = 0;
        for (j = 0; j < length1; j++) {
            if (l1[i] != l2[j]) //this checks numbers in the second list
                a = 1;         // and if they aren't found a gets the value  
        }                     //1 so after it's done checking if a is 1 it 
        if (a == 1)          //will add the number to the list, but if the  
            l2[j] = l1[i];  //number is found then a is 0 and nothing happens,
    } //                                         SUPPOSEDLY
    for (j = 0; j < length1; j++) {
        cout << l2[j] << " ";
    }
}

这个的输出是1 -858993460 12 2 4 1 3所以显然我做了一些非常错误的事情。我欢迎您提出任何建议,我不一定需要解决这个问题,我只是想解开。 非常感谢您花时间回复此事。

2 个答案:

答案 0 :(得分:3)

std::sort(l1, l1 + 100);
int* end_uniques = std::unique(l1, l1 + 100);
std::copy(l1, end_uniques, l2);
size_t num_uniques = end_uniques - l1;

这是O(N log N)而不是你的O(N ^ 2)解决方案,所以理论上更快。它需要首先对数组l1进行排序(就地)以让std::unique工作。然后你得到一个指向唯一元素末尾的指针,你可以用它来复制到l2当然得到计数(因为当然它可能小于100的完整大小)。

答案 1 :(得分:0)

最重要:此解决方案假设我们要保留订单

渴求

尝试这个...... 我已经更改了一些标识符(当然这不会影响执行) 它只会帮助我们确定变量的用途。

这是代码

#include <iostream>
using namespace std;

int main() 
{
    int Input[100], Unique[100], InSize, UniLength = 0;

    cin >> InSize;
    for (int ii = 0 ; ii < InSize ; ii++ ) 
    {
        cin >> Input[ii];
    }
    Unique[0] = Input[0];
    UniLength++;
    bool IsUnique;
    for ( int ii = 1 ; ii < InSize ; ii++ ) 
    {
        IsUnique=true;
        for (int jj = 0 ; jj < UniLength ; jj++ ) 
        {
            if ( Input[ii] == Unique[jj] )
            {
                IsUnique=false;
                break;
            }                     
        }                      
        if ( IsUnique )  
        {          
            Unique[UniLength] = Input[ii];
            UniLength++;
        }
    }
    for ( int jj = 0 ; jj < UniLength ; jj++ ) 
    {
        cout << Unique[jj] << " ";
    }
}

你在新数组中插入了原始索引的唯一元素.....并代替那些重复的元素....你没有做任何变换......即它们是未初始化的。 ....并且正在给出像-858993460

这样奇怪的东西

我很欣赏上面提到的两个答案,但是......我认为这个问题是针对hackerrank的......而且unqiue_array()在那里不起作用.....

<强>加

当然我们只能在输入数组中添加Unique元素.....但是......这个解决方案有效......此外,我们有2秒的执行时间限制......只有100个元素。 ....记住...... Big Oh Notation对于非常大的输入效果很好....这里的情况并非如此......所以看时间复杂性真的没有意义.......我选择的算法很容易理解。

我希望这就是你要找的......

度过愉快的一天。