2014-08-31 34 views
0

我想先說我是編程新手。我在用C++編寫另一個列表中不同數字的列表時遇到了問題。比方說,我有一個列表l1 = {1, 12, 2, 4, 1, 3, 2},我想創建一個新的列表,看起來像這樣l2 = {1, 12, 2, 4, 3} ...C++中的不同數字

這是我寫的:

#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所以很明顯,我做了有些事情非常錯誤我歡迎您提出任何建議,我不一定需要解決方案,我只是想脫鉤。 非常感謝您花時間回覆此問題。

+0

你是否確實在任何地方聲明瞭'j'?也許我會瘋了... – therealrootuser 2014-08-31 00:50:18

+0

似乎有邏輯上的缺陷 - 'for(j = 0; j ydoow 2014-08-31 00:52:48

+0

@ mattingly890是的,我編輯了我的帖子,對不起,我沒注意到當我第一次問我的queston時,我在初始程序中有一些其他變量用於菜單和東西,當我刪除那些我必須不小心刪除了j。 – Andrew 2014-08-31 00:54:25

回答

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()在那裏不起作用.....

新增

當然我們獨特的元素只會增加我們的輸入數組.....但......這個解決方案的工作.....此外,我們有2秒的執行時間限制... 。只有100個元素.....記住....大哦表示法適用於真正的大輸入....在這裏不是這種情況....所以真的沒有必要考慮時間複雜性。 ......我會選擇的是易於理解的算法。

我希望這是你正在尋找的...

祝你有愉快的一天。

+0

你先生,是一個救星!這是我想要的一切。感謝您抽出時間幫助,並讓事情變得如此清晰。由於我還是個新手,所以它對我的理解確實有幫助。 – Andrew 2014-08-31 12:02:28

+0

看完我的代碼後,有人會說我也是一個新手... – 2014-08-31 12:34:59

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的全部尺寸)。

+0

這可能會影響排序。我不清楚這是否重要。當然,它也會修改原始的集合。 – chris 2014-08-31 01:21:18

+0

我想你的意思是O(NlogN) – happydave 2014-08-31 02:33:09