当前位置: 首页 > article >正文

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

怎么说呢,实在是想不明白我这冒泡排序好像也没有问题呀,但是为甚么最后排序玩之后,会出现11在2 前面呢?

有点逆天,

package Lanqiao;

import java.util.Scanner;

/**
 * @author zb
 * date2025/3/21 10:24
 */
public class L2122 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n  = in.nextInt();
        int m = in.nextInt();
//        防止越界
        int a[] = new int[n+12];
        for (int i = 1; i <=n ; i++) {
            a[i] = i;
        }
//        冒泡排序
        for (int i = 1; i <n; i++) {
            for (int j = i+1; j <=n ; j++) {
                if(check(a[i],a[j])){
                    int temp = a[i];
                    a[i] =a[j] ;
                    a[j] =temp;

                }
            }
        }
        for (int i = 1; i <=n ; i++) {
            System.out.print(a[i]+" ");
        }
        System.out.println(a[m]);



        in.close();
    }
    static boolean  check(int x, int y){
        int sum1 = 0 ;
        int sum2 = 0 ;
//        计算两个数的各个位数的和
        while (x>0){
            sum1 += x%10;
            x = x /  10 ;
        }  while (y>0){
            sum2 += y%10;
            y = y /  10 ;
        }
//        如果前面那个哥哥位数的和比后面那个大,交换这两个元素
        if(sum1>sum2){
            return true;
        }else {
            return false;
        }

    }
}

看了半天解析;

总结一下就是使用Arrays。sort()

这是核心代码部分o1和o2是数组中的两个任意的元素,然后题目要求

首先按照数位和从小到大排列,

如果数位和大小相等那么就比较两个数本身的大小,小的放前面

当 sumB - sumA > 0(即 sumA < sumB)时,o1 会被排在 o2 前面,无论它们是否相邻。

当 o1 - o2 < 0(即 o1 < o2)时,数位和相同的 o1 会排在前面。

 按照数位和从小到da排序,数位和相同,就会比较o1o2的大小按照数字o1,o2从小到大排序(数字本身是不会相同的,除非o1,o2是同一个数字,当然这是不可能,因为比较器就是比较的是任意两个不同的数字o1,o2)

      Arrays.sort(a,(o1,o2)->{
            int sumA = digitsum(o1);
            int sumB = digitsum(o2);
            return (sumA!=sumB)?sumB-sumA:o1-o2;
        }

        );

 这里也可以写成下面这种,这种可能更清晰一点

Arrays.sort(a, (o1, o2) -> {
    int sumA = digitsum(o1); // 计算o1的数位和
    int sumB = digitsum(o2); // 计算o2的数位和
    
    if (sumA != sumB) {
        return sumA - sumB; // 关键点:返回差值!
    }
    return o1 - o2; // 数位和相同时比较数值
});

我的理解就是这其实相当于高考的时候理科报志愿,如果两个人分数相同,先看数学谁考的高如果数学分数相同,再看物理多少分这种

 看一下运行结果

如果改变sumA和sumB 的位置,比如改成下面这种

     Arrays.sort(a,(o1,o2)->{
            int sumA = digitsum(o1);
            int sumB = digitsum(o2);
            return (sumA!=sumB)?sumB-sumA:o1-o2;
        }

        );

 就会按照数位和从大到小排序,数位和相同,按照数字从小到大排序

总结一下,就是

如果o1 o2的初始顺序和返回条件的顺序是 相同的,那么就是升序排序,否则就是降序排序


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

/**
 * @author zb
 * date2025/3/21 10:24
 */
public class Main {

    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n =in.nextInt();
    int m = in.nextInt();
        Integer a[] =new Integer[n];
//        初始化数组
         for (int i = 0; i <n ; i++) {
             a[i] = i+1;

        }
        Arrays.sort(a,(o1,o2)->{
            int sumA = digitsum(o1);
            int sumB = digitsum(o2);
            return (sumA!=sumB)?sumA-sumB:o1-o2;
        }

        );
//        for (int i = 0; i <n ; i++) {
//            System.out.print(a[i]+" ");
//        }
        System.out.println(a[m-1]);



    in.close();

    }
//    求数位和
    static int digitsum(int n){
        int sum = 0  ;
        while (n>0){
            sum = sum + n%10 ;
            n = n/10 ;
        }
        return sum;
    }
}
//class Mycomparator implements Comparator<Integer>{
//
//    @Override
//    public int compare(Integer o1, Integer o2) {
//        if(o1<o2){
//            return 1;
//        } else if (o1>o2){
//            return -1;
//        }
//        return 0;
//    }
//}


http://www.kler.cn/a/600410.html

相关文章:

  • uniapp自身bug | uniapp+vue3打包后 index.html无法直接运行
  • Android Compose 框架基本状态管理(mutableStateOf、State 接口)深入剖析(十四)
  • Unity将运行时Mesh导出为fbx
  • 基于websocketpp实现的五子棋项目
  • MIPI 详解:XAPP894 D-PHY Solutions
  • 北京交通大学第三届C语言积分赛
  • 新手如何使用 Milvus
  • 大数据学习(83)-数仓建模理论
  • 新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案
  • x-cmd install | Wuzz - Web 开发与安全测试利器,交互式 HTTP 工具
  • 基于javaweb的SpringBoot公司财务管理设计与实现(源码+文档+部署讲解)
  • Linux上位机开发实战(编写API库)
  • VitePress由 Vite 和 Vue 驱动的静态站点生成器
  • Python:单例模式魔法方法
  • 【机器学习】--二分类
  • flink广播算子Broadcast
  • matlab近似计算联合密度分布
  • 当汉堡遇上便当:TypeScript命名空间 vs JavaScript模块化
  • 销售易CRM:技术革新助力客户关系管理智能化
  • DHCPv6 Stateless Vs Stateful Vs Stateless Stateful