数位排序题解

问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。

例如, 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;
    }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值