小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数n,m, 请问对 1 到n 采用这种方法排序时, 排在第m 个的元素是多少?
import java.util.*;
public class Practice04 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int result = findElement(n, m);
System.out.println(result);
}
//写一个方法来计算一个数的数位之和
public static int digitSum(int n) {
int s = 0;
while (n > 0) {
s += n % 10;
n /= 10;
}
return s;
}
//指定一个自定义的比较器
public static class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
int sumA = digitSum(a);
int sumB = digitSum(b);
if (sumA != sumB) {
return Integer.compare(sumA, sumB);
} else {
return Integer.compare(a, b);
}
}
}
public static int findElement(int n, int m) {
Integer[] numbers = new Integer[n];
for (int i = 0; i < n; i++) {
numbers[i] = i + 1;
}
Arrays.sort(numbers, new CustomComparator());
return numbers[m - 1];
}
}