1.逆序?
Collections.reverseOrder()
方法對列表進行逆序排序。通過 Collections.sort()
方法配合 Collections.reverseOrder()
,可以輕松實現從大到小的排序。
import java.util.ArrayList; // 導入 ArrayList 類,用于創建動態數組
import java.util.Collections; // 導入 Collections 類,提供集合操作工具方法
import java.util.List; // 導入 List 接口,表示一個有序集合public class ReverseSortExample { // 定義主類public static void main(String[] args) { // 程序的入口點// 創建一個整數列表,用于存儲數字List<Integer> numbers = new ArrayList<>();// 向列表中添加一些數字numbers.add(5); // 添加數字 5numbers.add(3); // 添加數字 3numbers.add(8); // 添加數字 8numbers.add(1); // 添加數字 1numbers.add(9); // 添加數字 9// 使用 Collections.sort() 方法對列表進行排序// Collections.reverseOrder() 指定排序順序為逆序(從大到小)Collections.sort(numbers, Collections.reverseOrder());// 輸出排序后的列表System.out.println(numbers); // 打印結果,例如:[9, 8, 5, 3, 1]}
}
2.數位排序
問題描述
小藍對一個數的數位之和很感興趣, 今天他要按照數位之和給數排序。當 兩個數各個數位之和不同時, 將數位和較小的排在前面, 當數位之和相等時, 將數值小的排在前面。
例如, 2022 排在 409 前面, 因為 2022 的數位之和是 6, 小于 409 的數位 之和 13 。
又如, 6 排在 2022 前面, 因為它們的數位之和相同, 而 6 小于 2022 。
給定正整數?n,mn,m, 請問對 1 到?nn?采用這種方法排序時, 排在第?mm?個的元 素是多少?
輸入格式
輸入第一行包含一個正整數?nn?。
第二行包含一個正整數?mm?。
輸出格式
輸出一行包含一個整數, 表示答案。
樣例輸入
13
5
樣例輸出
3
?根據數位之和對數字進行排序,并輸出第m個數字。數位之和就是把一個數字的每一位加起來,比如數字123的數位之和是1+2+3=6。
自定義排序規則
我們按照以下規則對數字進行排序:
-
先比較數位之和:數位之和小的數字排在前面。
-
如果數位之和相同:就按照數字本身的大小排序,小的排在前面。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 讀取nint m = sc.nextInt(); // 讀取mArrayList<Integer> list = new ArrayList<>();for (int i = 1; i <= n; i++) {list.add(i); // 把1到n的數字添加到列表中}// 使用自定義比較器進行排序Collections.sort(list, new Comparator<Integer>() {public int compare(Integer a, Integer b) {int sumA = digitSum(a); // 計算a的數位之和int sumB = digitSum(b); // 計算b的數位之和if (sumA != sumB) {return sumA - sumB; // 數位之和小的排在前面} else {return a - b; // 數位之和相同,按數值大小排序}}});System.out.println(list.get(m - 1)); // 輸出第m個元素(索引從0開始)}// 計算一個數字的數位之和private static int digitSum(int num) {int sum = 0;while (num > 0) {sum += num % 10; // 取最后一位數字并加到sum中num /= 10; // 去掉最后一位數字}return sum;}
}
封閉圖形個數
問題描述
在藍橋王國,數字的大小不僅僅取決于它們的數值大小,還取決于它們所形成的“封閉圖形”的個數。
封閉圖形是指數字中完全封閉的空間,例如數字?11、22、33、55、77?都沒有形成封閉圖形,而數字?00、44、66、99?分別形成了?11?個封閉圖形,數字?88?則形成了?22?個封閉圖形。值得注意的是,封閉圖形的個數是可以累加的。例如,對于數字?6868,由于?66?形成了?11?個封閉圖形,而?88?形成了?22?個,所以?6868?形成的封閉圖形的個數總共為?33。
在比較兩個數的大小時,如果它們的封閉圖形個數不同,那么封閉圖形個數較多的數更大。例如,數字?4141?和數字?1818,它們對應的封閉圖形的個數分別為?11?和?22,因此數字?4141?小于數字?1818。如果兩個數的封閉圖形個數相同,那么數值較大的數更大。例如,數字?1414?和數字?4141,它們的封閉圖形的個數都是?11,但?14<4114<41,所以數字?1414?小于數字?4141。 如果兩個數字的封閉圖形個數和數值都相同,那么這兩個數字被認為是相等的。
小藍對藍橋王國的數字大小規則十分感興趣。現在,他將給定你?nn?個數?a1,a2,…,ana1?,a2?,…,an?,請你按照藍橋王國的數字大小規則,將這?nn?數從小到大排序,并輸出排序后結果。
輸入格式
第一行包含一個整數?nn,表示給定的數字個數。
第二行包含?nn?個整數?a1,a2,…,ana1?,a2?,…,an?,表示待排序的數字。
輸出格式
輸出一行,包含?nn?個整數,表示按照藍橋王國的數字大小規則從小到大排序后的結果,每兩個數字之間用一個空格分隔。
樣例輸入
3
18 29 6
樣例輸出
6 29 18
樣例說明
對于給定的數字序列?[18,29,6][18,29,6],數字?1818?的封閉圖形個數為?22,數字?2929?的封閉圖形個數為?11,數字?66?的封閉圖形個數為?11。按照封閉圖形個數從小到大排序后,得到?[29,6,18][29,6,18]。
由于數字?2929?和數字?66?的封閉圖形個數相同,因此需要進一步按照數值大小對它們進行排序,最終得到?[6,29,18][6,29,18]。
做題思路:根據數字中“封閉圖形”的數量對數字進行排序。所謂“封閉圖形”是指數字中某些部分是封閉的,比如:
-
數字0、4、6、9各有一個封閉圖形。
-
數字8有兩個封閉圖形。
-
數字1、2、3、5、7沒有封閉圖形。
-
?自定義排序規則
我們按照以下規則對數字進行排序:
-
先比較封閉圖形的數量:封閉圖形數量少的數字排在前面。
-
如果封閉圖形數量相同:就按照數字本身的大小排序,小的排在前面。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class hh {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 讀取n,表示要處理的數字個數List<Integer> list = new ArrayList<>();for (int i = 1; i <= n; i++) {list.add(sc.nextInt()); // 讀取n個數字并添加到列表中}// 使用自定義比較器進行排序Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {int suma = f(o1); // 計算o1的封閉圖形數量int sumb = f(o2); // 計算o2的封閉圖形數量if (suma == sumb) {return o1 - o2; // 封閉圖形數量相同,按數字大小排序} else {return suma - sumb; // 封閉圖形數量少的排在前面}}});// 輸出排序后的列表for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}}// 計算一個數字中封閉圖形的數量public static int f(int m) {int sum = 0;while (m > 0) {int a = m % 10; // 取數字的最后一位if (a == 0 || a == 4 || a == 6 || a == 9) {sum += 1; // 這些數字有一個封閉圖形} else if (a == 8) {sum += 2; // 數字8有兩個封閉圖形} else {sum += 0; // 其他數字沒有封閉圖形}m = m / 10; // 去掉最后一位數字}return sum;}
}