2016-09-26 2 views
0

4 개의 다른 숫자로 이루어진 배열이 있다고 가정 해 봅시다.C++, 고유성을 찾으려면 숫자 배열을 정렬하십시오.

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

C에서 중첩 된 for 루프를 사용하여 고유성에 필요한 필수 자릿수를 식별하기 위해이 숫자를 앞뒤로 정렬 할 수 있습니까?

이 예에서 뒤에서 3 자릿수가 있어야 숫자에 비슷한 꼬리가 없는지 확인할 수 있습니다. 50234, 50934 = 3 자리 숫자는 각각 고유 한 값 = 502 및 509입니다.

for 루프는 숫자 하나 하나씩 숫자 하나 하나를 통과하여 동일한 숫자를 출력하여 3의 출력에 도달하는 것처럼 보입니까?

그것은 다음과 같이 갈 것 :

4

6 -이 번호를 삭제, 그것은 동일하지

4

4

그럼 :

3

5 -이 번호

다음

3

폐기 :

2

9 만세! 더 이상 비슷한 숫자가 없으므로 3이 답이됩니다.

나는 혼란스럽고 알아낼 수 없습니다.

도움을 주시면 감사하겠습니다. 감사합니다.

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에서 시작하여, 필요한 숫자의 번호를 확인합니다 :

+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}; 

로 시작하는 말

size_t digits = 1; 
    while(true) { 

반복 할 때마다 unordered_set

0123을 만듭니다.각 번호에 대한
 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)); 
     } 

, 우리는 완료 :

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

그렇지 않으면, 우리는 자리의 수를 늘려야합니다


전체 코드는 : 당신이 숫자를 정렬 할 경우

#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

안녕하세요 Ami, 솔루션에 감사드립니다. 나는 여전히 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; 
} 
관련 문제