2016-02-21 86 views
0

我試圖在兩個數組之間打印非常見元素。例如,如果array1 = {1,3,5}並且array2 = {1,2,4,5},那麼 ,我的輸出應該是{2,3,4}。從兩個數組中打印非常見元素

我在這裏試過一些東西。但它只打印3. 我做錯了什麼?

#include<iostream> 

using namespace std; 
int main() 
{ 
    int a[] = { 1, 3, 5 }; 
    int b[] = { 1, 2, 4, 5 }; 
     bool contains = false; 
     int result[10]; 
     int r = 0; 
     int x; 

    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 4; j++) { 
      if (a[i] == b[j]) { 
       contains = true; 
       break; 
      } 
     } 
     if (!contains) { 
      result[r]=a[i]; 
      ++r; 
     } 
     else{ 
      contains = false; 
     } 
    } 
    for (x = 0; x < r; x++) 
    { 
     cout<< result[x]<<"\n"; 
    } 

return 0; 
} 
+0

兩個數組的值是否排序?或者他們可以排序? – PaulMcKenzie

+0

它們可以排序 – chrisrhyno2003

+1

我推薦使用'std :: vector','std :: sort'和'std :: set_difference'。 – Rabbid76

回答

2

您添加了所有的「獨特」的價值觀從aresult,但你忘了從b添加所有值的result

編輯

類似的東西:

for (int i=0; i < sizeof(b)/sizeof(int); ++i, ++r) 
{ 
    result[r] = b[i]; 
} 
+0

有沒有我需要用來跟蹤這些元素的標誌或什麼? – chrisrhyno2003

+0

@AshwinVenkataraman no。在double'for'循環之後,你已經知道'result'只包含'a'中不屬於'b'的值,所以將'b'中的所有值加到'result'中是合理的。 –

0

你的算法學是錯在這裏。有一件事你的代碼在o(a * b)中運行,其中a和b是列表長度。

此外,它僅產生在A元素但不是在B.

做到這一點的方法是將兩個列表進行排序,然後通過A和B瀏覽,移動到最小的當前元素並將其添加如果兩個當前元素不同,則返回結果。
這將運行在o(log a + log b + a + b)。

4

您沒有將b的唯一值添加到result。但這是C++。我建議使用std::vector,std::sort,std::set_symmetric_differencestd::back_inserter

#include <iostream>  // std::cout 
#include <algorithm> // std::set_symmetric_difference, std::sort 
#include <iterator>  // std::back_inserter 
#include <vector>  // std::vector 

int main() 
{ 
    std::vector<int> a = { 1, 3, 5 }; 
    std::vector<int> b = { 1, 2, 4, 5 }; 

    std::sort(a.begin(), a.end()); 
    std::sort(b.begin(), b.end()); 

    std::vector<int> result; 
    std::set_symmetric_difference(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result)); 

    for (int x : result) 
     std::cout << x << "\n"; 

    return 0; 
} 

Live Example

正如在下面的評論建議通過@ChristianHackl,也可能使用ab陣列和使用所述自由站立功能std::beginstd::end

#include <iostream>  // std::cout 
#include <algorithm> // std::set_symmetric_difference, std::sort 
#include <iterator>  // std::back_inserter 
#include <vector>  // std::vector, std::begin, std::end 

int main() 
{ 
    int a[]{ 1, 3, 5 }; 
    int b[]{ 1, 2, 4, 5 }; 

    std::sort(std::begin(a), std::end(a)); 
    std::sort(std::begin(b), std::end(b)); 

    std::vector<int> result; 
    std::set_symmetric_difference(std::begin(a), std::end(a), std::begin(b), std::end(b), std::back_inserter(result)); 

    for (int x : result) 
     std::cout << x << "\n"; 

    return 0; 
} 
+0

這就是它應該是C++,從我+1。也許這個例子可以通過保留'a'和'b'的數組並使用獨立的'std :: begin'和'std :: end'函數來進一步改進, –