ITSA 202405 #4:特殊的排序

現在給您 N 個整數,請依他們每個位數之和由小到大排序,若每個位數之和相同,則依整數本身的數值由小到大排序。

假設現在有 3 個正整數 1234、1258、5122,正整數 1234,它的每個位數的相加為1 +. 2 + 3 + 4 = 10;1258 為 16;5122 為 10。所以排序結果為 1234、5122、1258。

範例測資

範例輸入範例輸出
第一行是一個正整數 T (1 ≤ T ≤ 10) 代表測試資料有幾筆。
每一筆測試資料共 2 行。第一行是一個正整數 N (2 ≤ N ≤ 10),其代表共有 N 個正整數。接著第二行包含了 N 個整數,每個整數用空白隔開,每個數字的位數是 3 到 7。
請依排序規則,輸出每筆測試資料的排序結果。
每行輸出最後必有換行符號。
5
3
1234 1258 5122
4
1725 3821 2011 1428
4
1925 2011 3210 9215
4
4145 1245 1485 1478
7
5584 12635 7894 12365 98453 56487 2134567
1234 5122 1258
2011 3821 1428 1725
2011 3210 1925 9215
1245 4145 1485 1478
12365 12635 5584 7894 2134567 98453 56487
ITSA 202405 #4 範例測資

解題思路

收資料的時候可以使用字串的方式收資料,然後跑 For迴圈 將每一個位數的數字進行相加。

宣告一個 Vector<pair<int, int>> 用來排序,因為會有位數總和相同的情況,這樣的情況下就是原本的數字較小就先輸出。將位數總和放在 Pair 的第一個欄位,原本的字串使用 stoi 轉為數字之後放在第二個欄位,並 Push_Back 到 Vector 中,之後就是 sort 了。

輸出的時候只需要將每一個 Pair 的 second 欄位輸出即可,需要注意的是最後一個資料後面是不能有空格的,要直接換行,所以可以在輸出的 For迴圈 內用判斷式判斷目前跑到的數字是否為 N-1。

範例程式碼-ITSA 202405 #4:特殊的排序

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

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    cout.sync_with_stdio(0);
    cout.tie(0);
    int T;
    cin >> T;
    for (int i = 0; i<T; i++) {
        int N;
        cin >> N;
        vector<pair<int, int>>v;
        for (int j = 0; j<N; j++) {
            string str;
            cin >> str;
            int sum = 0;
            for (int k = 0; k<str.length(); k++) sum += str[k] - '0';
            pair<int, int>p;
            p.first = sum;
            p.second = stoi(str);
            v.push_back(p);
        }
        sort(v.begin(), v.end());
        for (int j = 0; j<N; j++) {
            cout << v[j].second;
            if (j != N-1) cout << " ";
        }
        cout << "\n";
    }
}

//ITSA 202405 #4
//Dr. SeanXD

發佈留言