怎么说呢,实在是想不明白我这冒泡排序好像也没有问题呀,但是为甚么最后排序玩之后,会出现11在2 前面呢?
有点逆天,
java">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)
java"> Arrays.sort(a,(o1,o2)->{int sumA = digitsum(o1);int sumB = digitsum(o2);return (sumA!=sumB)?sumB-sumA:o1-o2;});
这里也可以写成下面这种,这种可能更清晰一点
java">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 的位置,比如改成下面这种
java"> Arrays.sort(a,(o1,o2)->{int sumA = digitsum(o1);int sumB = digitsum(o2);return (sumA!=sumB)?sumB-sumA:o1-o2;});
就会按照数位和从大到小排序,数位和相同,按照数字从小到大排序
总结一下,就是
如果o1 o2的初始顺序和返回条件的顺序是 相同的,那么就是升序排序,否则就是降序排序
java">
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;
// }
//}