
Digital Sum Sort
You are given an array of integers. Sort it in such a way that if a
comes before b
then the sum of digits of a
is less than or equal to the sum of digits of b
. If two numbers have the same sum of digits, the smaller one (in the regular sense) should come first.
Cho mảng số nguyên. Hãy sắp xếp chúng theo nguyên tắc:
a
đứng trướcb
nếu tổng các chữ số củaa
nhỏ hơnb
- Nếu hai số có tổng các chữ số bằng nhau, số nào nhỏ hơn sẽ đứng trước.
Ví dụ
4
và13
có tổng chữ số bằng nhau, nhưng4 < 13
nên4
sẽ đứng trước13
trong mảng kết quả
Ví dụ
- Ví dụ
a = [13, 20, 7, 4]
, kết quảdigitalSumSort(a) = [20, 4, 13, 7]
.
Đầu vào/Đầu ra
-
[Thời gian chạy] 0.5 giây
-
[Đầu vào] array.integer a
Mảng các số nguyên
Điều kiện:4 ≤ a.length ≤ 20
1 ≤ a[i] ≤ 1000
- [Đầu ra] array.integer
Mảng đã được sắp xếp theo yêu cầu đề bài
Lý thuyết
Thuật toán: Counting sort – Sắp xếp bằng đếm phân phối
- Trong trường hợp mà các giá trị của dãy số có giá trị dương nhỏ (Ví dụ:
A[i] ≤ 106
) thì ta có thể sử dụng đếm phân phối để sắp xếp dãy số. - Mô tả thuật toán:
- Gọi giá trị nhỏ nhất của dãy là
minVal
và giá trị lớn nhất của dãy làmaxVal
. - Với các giá trị
x
màminVal <= x <= maxVal
, đếm xem số lần xuất hiện củax
trong dãyA
. - Chạy giá trị
x
từminVal
đếnmaxVal
, gọi số lần xuất hiện củax
trong dãyA
làcnt_x
thì bỏ vào mảng kết quảcnt_x
lần giá trịx
- Gọi giá trị nhỏ nhất của dãy là
-
int Count[1000005]; std::vector<int> sortArray(std::vector<int> arr) { int maxVal = 0; for (int i = 0; i < (int) arr.size(); ++i) { int x = arr[i]; /// tìm giá trị lớn nhất của dãy maxVal = max(maxVal, x); /// đếm xem số lần xuất hiện của giá trị x trong dãy Count[x]++; } vector<int> ans; for (int i = 1; i <= maxVal; ++i) for (int j = 1; j <= Count[i]; ++j) ans.push_back(i); return ans; }
- Độ phức tạp: O(maxVal)
Hướng dẫn bài tập.
Code mẫu:
Ngôn ngữ C++:
int sum(int n){
int d = 0;
while(n > 0){
d += n % 10;
n /= 10;
}
return d;
}
std::vector<int> digitalSumSort(std::vector<int> a)
{
for (int i = 0; i < a.size()-1; i++)
for (int j = i + 1; j < a.size(); j++)
if (sum(a[i]) > sum(a[j]) || (sum(a[i]) == sum(a[j]) && a[i] > a[j])){
swap(a[i] ,a[j]);
}
return a;
}
Post Comment