一、 问题描述:
问题:
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n, m 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式:
输入第一行包含一个正整数 n。
第二行包含一个正整数 m 。
输出格式:
输出一行包含一个整数, 表示答案。
样例输入:
13
5
样例输出:
5
样例说明:
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 。
评测用例规模与约定:
对于 30% 的评测用例, 1 <= m <=n <=300
对于 50 %50% 的评测用例, 1≤m≤n≤1000 。
对于所有评测用例, 1≤m≤n≤10^{6} 。
运行限制:
最大运行时间:3s
最大运行内存: 512M
二.代码实现
首先想到用冒泡排序法来实现,但中间写代码的时候出现了一些问题,冒牌排序法的格式写的有点不对,纠正后的代码如下:
import java.util.Scanner;
public class text {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
//2.定义一个数组,并存入1-n的整数
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
//3.用冒泡排序法对用Sum方法计算过各个位数之和数按照各个位数之和排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
int sum1 = Sum(arr[j]);
int sum2 = Sum(arr[j + 1]);
if (sum1 > sum2 ) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(arr[m - 1]);
}
//1.定义一个方法计算各个位数之和
public static int Sum(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
}
看了题解之后发现可以用Arrays.sort()比较器来实现,具体代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
List<Pair> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
int sum = 0;
int tmp = i;
while (tmp > 0) {
sum += tmp % 10;
tmp /= 10;
}
list.add(new Pair(i, sum));
}
Collections.sort(list, new Comparator<Pair>() {
@Override
public int compare(Pair o1, Pair o2) {
if (o1.sum != o2.sum) {
return o1.sum - o2.sum;
} else {
return o1.value - o2.value;
}
}
});
System.out.println(list.get(m - 1).value);
}
static class Pair {
int value;
int sum;
public Pair(int value, int sum) {
this.value = value;
this.sum = sum;
}
}
}