蓝桥杯——数位排序(JAVA)

题目:

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

例如, 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,9 。第 5 个数为 3 。

评测用例规模与约定

对于30% 的评测用例,1≤m≤n≤300 。

对于50% 的评测用例, 1≤m≤n≤1000 。

对于所有评测用例, 1≤m≤n≤106 。

运行限制

  • 最大运行时间:3s
  • 最大运行内存: 512M

代码: 

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n,m;                         
        n=sc.nextInt();
        m=sc.nextInt();
        Integer[] arr=new Integer[n];  //必须用int的包装类Integer
        for (int i=0;i<n;i++){
            arr[i]=i+1;
        }
        Arrays.sort(arr,((o1, o2) -> js(o1)!=js(o2)?js(o1)-js(o2):o1-o2)); //Lambda表达式用sort方法进行排序
        System.out.println(arr[m-1]);
        sc.close();

    }
    public static int js(Integer a){    //求数位和
        int sum=0;
        while(a>0){
            sum+=a%10;
            a=a/10;
        }
        return sum;
    }
}

思路:本题用sort方法中的

    • sort(T[] a, Comparator<? super T> c)

      根据指定的比较器引发的顺序对指定的对象数组进行排序

 此方法可以根据设置的条件交换元素的顺序,

Arrays.sort(arr,((o1, o2) -> js(o1)!=js(o2)?js(o1)-js(o2):o1-o2));

这段代码采用了Lambda表达式意思是比较前后两个数的数位和如果不同,则将数位和较小的放到前面,如果数位和相同则将较小的数字放到前面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,带分可以用分类来表示。下面是一个简单的带分类的实现: ```java public class Fraction { private int integer; private int numerator; private int denominator; public Fraction(int integer, int numerator, int denominator) { this.integer = integer; this.numerator = numerator; this.denominator = denominator; simplify(); } private void simplify() { if (numerator < 0 && denominator < 0) { numerator = -numerator; denominator = -denominator; } if (denominator < 0) { numerator = -numerator; denominator = -denominator; } if (integer < 0 && numerator > 0) { numerator = -numerator; } if (integer < 0 && numerator == 0) { integer = -integer; } if (numerator >= denominator) { integer += numerator / denominator; numerator = numerator % denominator; } int gcd = gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } private int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } public Fraction add(Fraction other) { int newNumerator = this.numerator * other.denominator + other.numerator * this.denominator; int newDenominator = this.denominator * other.denominator; int newInteger = this.integer + other.integer; return new Fraction(newInteger, newNumerator, newDenominator); } public String toString() { if (integer == 0 && numerator == 0) { return "0"; } String result = ""; if (integer != 0) { result += integer; if (numerator != 0) { result += "_"; } } if (numerator != 0) { result += numerator + "/" + denominator; } return result; } } ``` 这个带分类实现了以下功能: - 构造函可以根据整部分、分子和分母创建一个带分对象。 - simplify() 方法可以将带分对象化简,如将负号移到分子上、将整部分和真分部分合并、将分化简等。 - add() 方法可以将个带分对象相加,返回一个新的带分对象。 - toString() 方法可以将带分对象转换为字符串形式。 这个类实现了带分的加法操作,可以参考这个类来实现其他的运算操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值