2016-09-26 35 views
0

說我有一個4個不同數字的數組。C++,通過數組排序來尋找唯一性

int numbers [4] = {50234,50356,50454,50934};

如何在C++中爲嵌套for循環來從後到前對這些數字進行排序以確定唯一性所需的數字量?

從這個例子你可以知道你需要從後面3位數字,以確保沒有數字包含數字相似的尾巴。 50234,50934 = 3個數字使它們唯一= 502和509。

for循環看起來像是逐個遍歷每個數字,按數字編號,然後對相同的數字進行排序以達到3的輸出?

它會是這樣的:

6 - 放棄這個號碼,它不相同

然後:

5 - 丟棄該號碼

然後:

9烏拉!不再有類似的數字,打印出3就是答案。

我很難過,無法弄清楚。

任何幫助將不勝感激,謝謝。

+0

難道你確實需要檢查整個號碼嗎? '502123456789'和'503123456789'從後面有很多相同的數字,但它們是不同的數字。 – NathanOliver

+0

邏輯不邏輯 – Raindrop7

+0

我是C++的新手,只是初學者。我不需要檢查整個號碼。我只是想讓它從後面到前面遍歷數字的每個位置。它可以丟棄沒有數字相似的數字,並且一旦到達沒有數字相似的數字的位置就停止。那有意義嗎? :/ – Mitrani

回答

2

假設您從

#include <unordered_set> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
    const std::vector<int> numbers{50234, 50356, 50454, 50934}; 

您可以將其轉化爲一個字符串矢量:

std::vector<std::string> string_numbers; 
    std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); }); 

現在,我們將檢查所需的位數,從1:

size_t digits = 1; 
    while(true) { 

在每次迭代中,我們將創建一個unordered_set

 std::unordered_set<std::string> partials; 

對於每個編號,我們會嘗試將它digits數字進入設置:

 for(const auto &s: string_numbers) { 
      if(s.size() <= digits) { 
       std::cout << "not unique" << std::endl; 
       return 0; 
      } 
      partials.insert(s.substr(0, digits)); 
     } 

如果集合的大小是矢量的大小,我們就大功告成了:

 if(partials.size() == numbers.size()) { 
       std::cout << digits << " required" << std::endl; 
       return 0; 
      } 

否則,我們需要增加的位數:

 ++digits; 
    } 
} 

全碼:

#include <unordered_set> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
    const std::vector<int> numbers{50234, 50356, 50454, 50934}; 

    std::vector<std::string> string_numbers; 
    std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); }); 

    size_t digits = 1; 
    while(true) { 
     std::unordered_set<std::string> partials; 
     for(const auto &s: string_numbers) { 
      if(s.size() <= digits) { 
       std::cout << "not unique" << std::endl; 
       return 0; 
      } 
      partials.insert(s.substr(0, digits)); 
     } 
     if(partials.size() == numbers.size()) { 
       std::cout << digits << " required" << std::endl; 
       return 0; 
      } 
     ++digits; 
    } 
} 
+0

嗨阿美,只想說在這裏感謝你的解決方案。我對C++仍然很陌生,這超出了我能理解的水平,但它讓我得到了我需要的答案。謝謝。 – Mitrani

0

如果要數字進行排序,以便使用的排序算法一個比方說,冒泡排序。然後檢查唯一性和獨特的值存儲在一個新的數組,然後打印出來:

我們使我們的代碼的理解和實踐,但是在我們使用的庫一個真正的程序他們太強大,快捷:

#include <iostream> 
using std::cout; 
using std::endl; 



int main() 
{ 

    int numbers[4] = {50234, 50356, 50454, 50934}; 
// int numbers[4] = {50234, 50356, 50454, 50356}; 

    for(int i(0); i < 4; i++) 
    { 
     for(int j(i + 1); j < 4; j++) 
     { 
      if(numbers[i] > numbers[j]) 
      { 
       numbers[i] ^= numbers[j]; 
       numbers[j] ^= numbers[i]; 
       numbers[i] ^= numbers[j]; 
      } 
     } 
    } 

    for(int i = 0; i < 4; i++) 
     cout << numbers[i] << ", "; 

    int nUniq = 0; 
    bool isUniq = true; 

    for(int i = 0; i < 4; i++) 
    { 
     isUniq = true; 

     for(int j(i + 1); j < 4; j++) 
     { 
      if(numbers[i] == numbers[j]) 
      { 
       isUniq = false; 
       break; 
      } 
     } 
     if(isUniq) 
      nUniq++; 
    } 

    cout << nUniq << endl; 

    int* ptrUniq = new int[nUniq]; 
    int k = 0; 

    for(int i = 0; i < 4; i++) 
    { 
     isUniq = true; 

     for(int j(i + 1); j < 4; j++) 
     { 
      if(numbers[i] == numbers[j]) 
      { 
       isUniq = false; 
       break; 
      } 
     } 
     if(isUniq) 
     { 
      ptrUniq[k] = numbers[i]; 
      k++; 
     } 
    } 

    cout << "\nhere are uniq values:\n\n"; 
    for(int i = 0; i < nUniq; i++) 
     cout << ptrUniq[i] << ", "; 

    delete[] ptrUniq; 
    ptrUniq = NULL; 


    cout << endl << endl; 
    return 0; 
}