问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n, m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式
输入第一行包含一个正整数 nn 。
第二行包含一个正整数 mm 。
输出格式
输出一行包含一个整数, 表示答案。
样例输入
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 。
评测用例规模与约定
对于 30 %30% 的评测用例, 1 \leq m \leq n \leq 3001≤m≤n≤300 。
对于 50 %50% 的评测用例, 1 \leq m \leq n \leq 10001≤m≤n≤1000 。
对于所有评测用例, 1 \leq m \leq n \leq 10^{6}1≤m≤n≤10
6
。
。
运行限制
最大运行时间:3s
最大运行内存: 512M
1.看完题目后写了一个夜自习都没有写出来,最开始我用将1-n的数先把各个数位之和算出来放到数组里,但是后来发现这样的话最后又要取最开始的值进行输出
2.没有将数组排序好,输出结果错误
3.用Arrays.sort()对数组排序,将数值传进去,定义一个方法来求数位之和,之后将数组进行升序并返回,如果数位之和相等就直接将数字进行升序返回.
import java.util.Arrays;
import java.util.Scanner;
public class shuweipaixu {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
//键盘录入n,m
int n = sc.nextInt();
int m=sc.nextInt();
//定义一个引用数据类型的数组,下面的参数需要
Integer[] a =new Integer[n];
for (int i = 0; i < n; i++) {
//对数组赋值
a[i]=i+1;
}
//用sort()方法对数组进行升序排序
Arrays.sort(a,(o1,o2)->digitsum(o1)!=digitsum(o2)?digitsum(o1)-digitsum(o2):o1 - o2);
System.out.println(a[m-1]);
sc.close();
//定义一个方法来求取数位之和
private static int digitsum(Integer num){
int sum=0;
while(num>0){
//求得出最后一个数字并且相加
sum+=num%10;
//除以10后进而再去取余可以得到下一个最后一个数字
num/=10;
}
//将数位之和返回
return sum;
}
}