2016-05-06 6 views
-4

私はa = [13、20、7、4]の整数の配列を与えられ、私はdigitalsumandsort(a)= [20,4,13,7]関数を次のように記述しようとしています。 2つの数字の桁の和が同じ場合は、小さいほうが最初に来るはずです。 4と13は同じ桁の合計を持ちますが、どちらも存在する任意のデジタルソルソートソートでは、4は0 13よりも前になります。しかし、数字ではなく数字の合計だけを並べ替えることができます。ハッシュ関数はこの問題には完璧ですが、私は整数の配列を使ってこれを解決しようとしています。ここに私のコードがあり、どんな提案も大変ありがとうと思います。デジタル合計とソートの実装

std::vector<int> digitalsumandsort(std::vector<int> a) { 
    std::vector<int> result; 
    int sum=0; 
    int max=999; 
    int temp; 
    for (int i=0; i<a.size();i++){ 
     temp=a[i]; 
     while(temp>0){ 
      sum+=temp%10; 
      temp/=10; 
     } 
     result.push_back(sum); 
     sum=0;  
    } 
    std::sort(result.begin(),result.begin()+4); 
    return result; 
} 

入力: :[13、20、7、4] 出力: [2、4、4、7] 期待出力: [20、4、13、7]

+0

あなたは 'result'をソートして返します。 'result'には合計が含まれます。合計を集め、合計に応じて 'a'をソートし、ソートされた' a'を返します。デジタル和とソース番号の組を含む 'ベクトル 'を考えてみるか、デジタル和を計算してデジタル和に応じてソース番号をソートするカスタムコンパレータを指定してください。 – user4581301

答えて

0

sort関数にカスタムコンパレータを指定する必要があります。

std::vector<int> initial_values = {13, 20, 4, 7}; 
std::vector<int> sorted_values = initial_values; 
std::sort(sorted_values.begin(), sorted_values.end(), [](const int & a, const int & b) { 
    int a_temp = a, b_temp = b; 
    int a_sum = 0, b_sum = 0; 
    while(a_temp != 0) { 
     a_sum += a_temp % 10; 
     a_temp /= 10; 
    } 
    while(b_temp != 0) { 
     b_sum += b_temp % 10; 
     b_temp /= 10; 
    } 
    if(a_sum != b_sum) return a_sum < b_sum; 
    else return a <= b; 
}); 

print_contents_of_vector(initial_values); 
print_contents_of_vector(sorted_values); 

出力:

{13, 20, 4, 7} //From initial value printing 
{20, 4, 13, 7} //From sorted value printing 
+0

ありがとう@Xirema – foo0507

0

ここでは、あなたがこれを行うことができる方法です。次のようにソート関数にコンパレータを使用します。ここにはlinkがあります。

#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

int sum_digits(int a) { 
    int sum=0; 
    while(a!=0) { 
     sum += a%10; 
     a /= 10; 
    } 
    return sum; 
} 

struct Comparator { 
    bool operator()(int a, int b) { 
     int sum_digits_a = sum_digits(a); 
     int sum_digits_b = sum_digits(b); 

     if(sum_digits_a == sum_digits_b) 
      return a < b; 
     return sum_digits_a < sum_digits_b; 
    } 
}; 

int main() { 
    vector<int> vec{13, 20, 7, 4}; 
    sort(vec.begin(), vec.end(), Comparator()); 

    for(auto v : vec) 
     cout << v << " "; 
    return 0; 
} 
関連する問題