兩段代碼分別解決了兩個不同的問題,下面是對它們的概述:
1、(字符串分隔(二)):
這段代碼是解決“字符串分隔(二)”的問題。它提供了一個Java類Main
,其中包含一個方法solution
,該方法接收一個字符串s
和一個整數k
。任務是對字符串s
進行處理,使其除第一個子串外,其余的子串每k
個字符組成新的子串,并根據子串中大寫字母和小寫字母的數量進行大小寫轉換。
代碼首先使用String.split
方法以'-'
為分隔符將原始字符串s
分割成多個子串,并將這些子串加入到StringJoiner
中,它用于構建最終的字符串。
接著,代碼遍歷除了第一個子串之外的所有子串,以k
為步長進行切片,然后對每個切片后的子串調用change
方法進行大小寫轉換。change
方法會計算子串中大寫字母和小寫字母的數量,并根據數量的多少來決定是否進行大小寫轉換。
最后,返回構建好的字符串。
2、(歡樂的周末):
這段代碼是解決“歡樂的周末”的問題。它提供了一個Java類Main
,其中包含一個方法getResult
,該方法接收一個地圖的二維數組表示,地圖上有通暢的道路(用0
表示)、障礙物(用1
表示)、小華或小為的位置(用2
表示)、以及被選中的聚餐地點(用3
表示)。任務是計算小華和小為都能到達的聚餐地點的數量。
代碼首先讀取地圖的大小和具體信息,然后使用一個UnionFindSet
對象來處理地圖上的連通性。UnionFindSet
是一個并查集的數據結構,用于快速判斷兩個節點是否在同一個連通分量中。
在處理地圖時,代碼會記錄小華和小為的位置,以及所有聚餐地點的位置。然后,遍歷地圖上的每個單元格,如果單元格不是障礙物,則將其與相鄰的非障礙物單元格合并(在并查集中的術語是“union”)。
接著,代碼會找到小華和小為所在連通分量的根節點,并檢查這兩個根節點是否相同。如果不同,則表示小華和小為無法到達同一個聚餐地點,返回0
。
如果小華和小為在同一個連通分量中,代碼將繼續遍歷所有聚餐地點,并檢查每個地點是否也在該連通分量中。如果在,計數器ans
會增加。
最后,返回計數器ans
作為結果。
package OD154;import java.util.Scanner;
import java.util.StringJoiner;/*** @description 字符串分隔(二)* @level 6*//*** 題目描述* 給定一個非空字符串S,其被N個‘-’分隔成N+1的子串,給定正整數K,要求除第一個子串外,其余的子串每K個字符組成新的子串,并用‘-’分隔。* <p>* 對于新組成的每一個子串,如果它含有的小寫字母比大寫字母多,則將這個子串的所有大寫字母轉換為小寫字母;* <p>* 反之,如果它含有的大寫字母比小寫字母多,則將這個子串的所有小寫字母轉換為大寫字母;大小寫字母的數量相等時,不做轉換。* <p>* 輸入描述* 輸入為兩行,第一行為參數K,第二行為字符串S。* <p>* 輸出描述* 輸出轉換后的字符串。*/
// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//分隔子串的長度int n = Integer.parseInt(sc.nextLine());//原始子串String s = sc.nextLine();System.out.println(solution(s, n));}//將字符串按k長度分隔,中間添加"-",并轉換大小寫public static String solution(String s, int k) {String[] strs = s.split("-");StringBuilder sb = new StringBuilder();StringJoiner sj = new StringJoiner("-");//第一個直接加sj.add(strs[0]);//把剩下的字符串合并成一個新字符串for (int i = 1; i < strs.length; i++) {sb.append(strs[i]);}String newStr = sb.toString();//把剩下的字符串按k個分組,最后一組是到末尾結束for (int i = 0; i < newStr.length(); i += k) {String sub = newStr.substring(i, Math.min(i + k, newStr.length()));//轉換大小寫后添加進sjsj.add(change(sub));}return sj.toString();}//將字符串根據大小寫數量轉換大小寫public static String change(String s) {int upper = 0;int lower = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') {upper++;}else if (s.charAt(i) >= 'a' && s.charAt(i) <= 'z') {lower++;}}//如果大寫多if (upper > lower) {return s.toUpperCase();}else if (lower > upper) {return s.toLowerCase();}else {return s;}}
}
package OD197;import java.util.ArrayList;
import java.util.Scanner;/*** @description 歡樂的周末* @level 7* @score 100* @url https://hydro.ac/d/HWOD2023/p/OD197*//*** 題目描述* 小華和小為是很要好的朋友,他們約定周末一起吃飯。* <p>* 通過手機交流,他們在地圖上選擇了多個聚餐地點(由于自然地形等原因,部分聚餐地點不可達),求小華和小為都能到達的聚餐地點有多少個?* <p>* 輸入描述* 第一行輸入m和n,m代表地圖的長度,n代表地圖的寬度。* <p>* 第二行開始具體輸入地圖信息,地圖信息包含:* <p>* 0 為通暢的道路* <p>* 1 為障礙物(且僅1為障礙物)* <p>* 2 為小華或者小為,地圖中必定有且僅有2個 (非障礙物)* <p>* 3 為被選中的聚餐地點(非障礙物)* <p>* 輸出描述* 可以被兩方都到達的聚餐地點數量,行末無空格。*/
// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {//位移偏量static int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};private static int rows;private static int cols;private static int[][] matrix;public static void main(String[] args) {Scanner sc = new Scanner(System.in);//長 寬rows = sc.nextInt();cols = sc.nextInt();//2是人位置 1是障礙物 3是聚餐地點matrix = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {matrix[i][j] = sc.nextInt();}}//輸出:能共同到達的餐廳數量System.out.println(getResult());}public static int getResult() {//并查集UnionFindSet ufs = new UnionFindSet(rows * cols);//記錄小華、小為的位置ArrayList<Integer> address = new ArrayList<>();//記錄餐廳的位置ArrayList<Integer> restaurants = new ArrayList<>();//遍歷每一個起點for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {//把除了障礙物之外的都連通if (matrix[i][j] != 1) {//如果不是障礙物,轉為一維坐標posint pos = i * cols + j;//如果是小華、小為if (matrix[i][j] == 2) {address.add(pos);} else if (matrix[i][j] == 3) {restaurants.add(pos);}for (int[] offset : offsets) {int newI = i + offset[0];int newJ = j + offset[1];//如果沒越界,且不是障礙物if (newI >= 0 && newI < rows && newJ >= 0 && newJ < cols && matrix[newI][newJ] != 1) {//如果(i,j)和(newI,newJ)的位置都是非1,則合并,都轉一維坐標ufs.union(pos, newI * cols + newJ);}}}}}//小華所在連通分量的根int hua_fa = ufs.find(address.get(0));//小為int wei_fa = ufs.find(address.get(1));//如果不屬于同一個分量,則無法去同一家餐廳if (hua_fa != wei_fa) {return 0;}//記錄題解:共同能到達的餐廳數量int ans = 0;for (Integer restaurant : restaurants) {if (ufs.find(restaurant) == hua_fa) {ans++;}}return ans;}}//實現并查集
class UnionFindSet {int[] fa;public UnionFindSet(int n) {fa = new int[n];for (int i = 0; i < n; i++) {fa[i] = i;}}public int find(int x) {if (x != this.fa[x]) {this.fa[x] = this.find(this.fa[x]);return this.fa[x];}return x;}public void union(int x, int y) {int x_fa = this.find(x);int y_fa = this.find(y);if (x_fa != y_fa) {this.fa[y_fa] = x_fa;}}
}