问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式
输入第一行包含一个正整数 n 。
第二行包含一个正整数 m 。
输出格式
输出一行包含一个整数, 表示答案。
样例输入
13
5
样例输出
3
样例说明
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,91,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。
解题思路:
先定义一个1-n的数组,在准备一个可以获得数位之和的方法,接着将数组中的元素按照一定的排序方法排序,这就需要自定义排序方法了。
定义数组简单,重要的是如何获得数位之和的方法以及手动写排序方法了。
获得数位之和的方法,我利用了递归的方法来依次将数位相加,话不多说,上代码
static int summ(int n, int sum) {
if(n == 0){ return sum;}
else{
sum+=(n - n / 10 * 10);
}
return summ(n / 10,sum);
}
然后自定义排序方法,其中引用了上面的summ函数
Arrays.sort(arr, 1, n + 1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
int s1 = summ(o1,sum);
int s2 = summ(o2,sum);
if (s1 > s2) {
return 1;
}
if (s1 < s2) {
return -1;
}
return o1 - o2;//升序
}
});
System.out.println(arr[m]);
这样其中的两个重点分析完毕。
完整且正确代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int sum=0;
Integer[] arr = new Integer[n + 1];
for (int i = 1; i <= n; i++) {
arr[i] = i;
}
Arrays.sort(arr, 1, n + 1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
int s1 = summ(o1,sum);
int s2 = summ(o2,sum);
if (s1 > s2) {
return 1;
}
if (s1 < s2) {
return -1;
}
return o1 - o2;//升序
}
});
System.out.println(arr[m]);
sc.close();
}
static int summ(int n, int sum) {
if(n == 0){ return sum;}
else{
sum+=(n - n / 10 * 10);
}
return summ(n / 10,sum);
}
}
收获:重温了一下自定义排序方法的写法。