一、劃分位數求解型

01數位倍數

藍橋杯 JavaB 歷年競賽真題 && 詳解_git

解題思路:

1.分析題目:題目要求關鍵在於求每個數位的和,所以我們考慮將每個數位單獨分離出來,然後用判斷語句計數。

2.分離要點:因為題目要從1找到202504,遂考慮先用for循環遍歷數字,然後將每個數 i 賦值給num,再通過while 循環計算它的各個數位之和。在while循環中,每次通過num%10 獲取num 的最後一位數字(分離數位的關鍵)並累加到sum中,然後通過num=num/10去掉num 的最後一位數字,直到num變為 0(通過這種方式篩查1--202504中的所有數字),此時sum 就是該數的各個數位之和。

3.輸出結果:最後輸出sum即為答案。

完整代碼:

import java.util.Scanner;
// 1:無需package
// 2: 類名必須Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此輸入您的代碼...
        int count = 0;
        for (int i = 1; i <= 202504; i++) {
            int num = i;
            int sum = 0;
            while (num > 0) {
                sum += num % 10;
                num = num / 10;
            }
            if (sum % 5 == 0) {
                count++;
            }
        }
        System.out.print(count);
        scan.close();
    }
}

02好數

藍橋杯 JavaB 歷年競賽真題 && 詳解_git_02

解題思路1:(暴力版)

1.關鍵拆分步驟:拆分數字的各個位數,對於每個數 i,通過取餘和整除運算,分別得到它的個位(a)、十位(b)、百位(c)、千位(d)、萬位(e)、十萬位(f)、百萬位(g)上的數字。

2.判斷是否為好數:

  • 當數 i 小於等於 10 時,直接判斷個位數字 a 是否為奇數(a % 2 != 0),如果是,説明是 “好數”,count 加 1。
  • 當數 i 小於等於 100 時,判斷十位數字 b 是否為偶數(b % 2 == 0)且個位數字 a 是否為奇數(a % 2 != 0),如果是,count 加 1。
  • 以此類推,對於三位數、四位數等更多位數的數,按照 “奇數位上的數字是奇數,偶數位上的數字是偶數” 的規則,分別判斷各位數字是否符合條件,若都符合,count 加 1。

完整代碼:

import java.util.Scanner;
// 1:無需package
// 2: 類名必須Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此輸入您的代碼...
        int N=scan.nextInt();
        int count=0;
        for(int i=0;i;i++){>


解題思路2:1.內層逐位判斷:驗證 “好數” 規則用while循環逐位提取數字i的每一位:通過num % 10獲取當前最低位,仍然通過num = num / 10移除已判斷的低位。用digitPos記錄當前數位(從 1 開始,對應個位為 “第 1 位”),動態判斷:若digitPos為奇數(個位、百位等),則要求當前位digit為奇數,否則標記為 “非好數” 並跳出循環;若digitPos為偶數(十位、千位等),則要求當前位digit為偶數,否則標記為 “非好數” 並跳出循環。2.統計結果:累計符合條件的數量若某個數字i通過所有位的判斷(isGood保持true),則count計數加 1,最終輸出count即為結果。完整代碼:import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int count = 0;
        for (int i = 1; i < N; i++) { // 遍歷1到N-1的數
            int num = i;
            int digitPos = 1; // 記錄當前數位(從個位開始,即第1位)
            boolean isGood = true; // 標記是否為好數
            while (num > 0) {
                int digit = num % 10; // 提取當前位(先個位,再十位...)
                // 判斷當前位是否符合規則:奇數位為奇數,偶數位為偶數
                if (digitPos % 2 == 1) { // 奇數位(1、3、5...)
                    if (digit % 2 == 0) { // 若為偶數則不符合
                        isGood = false;
                        break;
                    }
                } else { // 偶數位(2、4、6...)
                    if (digit % 2 == 1) { // 若為奇數則不符合
                        isGood = false;
                        break;
                    }
                }
                num = num / 10; // 移除已判斷的位
                digitPos++; // 數位+1(下一位是更高位)
            }
            if (isGood) {
                count++;
            }
        }
        System.out.println(count);
        scan.close();
    }
}改進優點:對比維度
逐位動態判斷
固定位數判斷(暴力)
1. 通用性
不限制數字位數,無論是 1 位、3 位還是 10 位數字,都能正常判斷,適配任意 N(如 N=100000000 時仍可運行)。
僅覆蓋 1 到 7 位數字(通過a-g固定變量提取位),若 N 超過 10000000(8 位及以上),會漏判或錯判。
2. 可維護性
邏輯集中,若 “好數” 規則修改(如 “奇數位為偶數”),僅需修改if條件中的判斷(如把digit%2==0和digit%2==1互換),改動成本極低。
規則修改需逐個修改 7 個else if中的判斷條件(如a%2!=0、b%2==0等),改動繁瑣且易出錯。
3. 代碼簡潔性
代碼行數少(約 30 行),僅用 1 個while循環處理所有位數,邏輯無冗餘。
代碼冗餘(重複寫 7 個位數的判斷條件),且包含無效判斷(如i<=10時仍會定義c-g等無用變量)。
4. 邏輯嚴謹性
遍歷從 1 開始,精準對應 “1 到 N-1” 的統計範圍,無多餘判斷(如 0 不會被計入,符合常規 “好數” 的統計場景)。
遍歷從 0 開始,會額外判斷 0(0 不符合 “好數” 規則,雖不影響結果,但屬於無效計算);且固定位數判斷易因邊界條件(如i=100時誤判)出錯。
03 2025解題思路:1. 明確目標要統計在 1 到 20250412 範圍內,滿足 “數字中至少含有 1 個 0、2 個 2、1 個 5” 條件的數的個數。2. 遍歷範圍使用 for 循環從 1 遍歷到 20250412,逐個檢查每個數是否符合條件。3. 統計數字出現次數對於每個數 i,通過不斷取餘(%10)和整除(/ 10)的操作,依次提取其每一位數字。定義三個變量 zero、two、five,分別用於統計當前數中 0、2、5 出現的次數。
每提取出一位數字,就判斷該數字是 0、2 還是 5,並對應地增加相應變量的計數。
4. 判斷是否符合條件在提取完當前數的所有位並統計好 0、2、5 的出現次數後,檢查是否滿足 “至少 1 個 0、至少 2 個 2、至少 1 個 5” 的條件。如果滿足,就將計數器 count 加 1。5. 輸出結果遍歷完所有數後,輸出count 的值,即為滿足條件的數的總個數。完整代碼:import java.util.Scanner;
// 1:無需package
// 2: 類名必須Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此輸入您的代碼...
        int count=0;
        for (int i=1;i<=20250412;i++){
            int num=i;
            int zero=0;
            int two=0;
            int five=0;
            int d1=num%10;
            if(num>0){
                if (d1==0){
                    zero++;
                }else if(d1==2){
                    two++;
                }else if(d1==5){
                    five++;
                }
            }
            num=num/10;
            int d2=num%10;
            if(num>0){
                if (d2==0){
                    zero++;
                }else if(d2==2){
                    two++;
                }else if(d2==5){
                    five++;
                }
            }
            num=num/10;
            int d3=num%10;
            if(num>0){
                if (d3==0){
                    zero++;
                }else if(d3==2){
                    two++;
                }else if(d3==5){
                    five++;
                }
            }
            num=num/10;
            int d4=num%10;
            if(num>0){
                if (d4==0){
                    zero++;
                }else if(d4==2){
                    two++;
                }else if(d4==5){
                    five++;
                }
            }
            num=num/10;
            int d5=num%10;
            if(num>0){
                if (d5==0){
                    zero++;
                }else if(d5==2){
                    two++;
                }else if(d5==5){
                    five++;
                }
            }
            num=num/10;
            int d6=num%10;
            if(num>0){
                if (d6==0){
                    zero++;
                }else if(d6==2){
                    two++;
                }else if(d6==5){
                    five++;
                }
            }
            num=num/10;
            int d7=num%10;
            if(num>0){
                if (d7==0){
                    zero++;
                }else if(d7==2){
                    two++;
                }else if(d7==5){
                    five++;
                }
            }
            num=num/10;
            int d8=num%10;
            if(num>0){
                if (d8==0){
                    zero++;
                }else if(d8==2){
                    two++;
                }else if(d8==5){
                    five++;
                }
            }
            if(zero>=1 && two>=2 && five>=1){
            count++;
        }
        }
        System.out.println(count);
        scan.close();
    }
}二、字符串型01確定字符串是否包含唯一字符解題思路:1.明確目標題目需要我們識別一個字符串裏每個字符是否只出現一次,因此先第一步先讀取字符串。2.考慮識別方式第一時間考慮到用雙循環遍歷,實現相互對照。因此順勢引入boolean變量isUnique,默認值為 true(表示字符默認是唯一的。3.雙重循環遍歷查找用雙重 for 循環遍歷所有字符:外層循環遍歷每個字符(索引 i),內層循環遍歷 i 之後的所有字符(索引 j)。4.注意限定條件題目顯示忽略字母大小寫,因此需要對每對字符進行 Character.toLowerCase(str.charAt(i))和 Character.toLowerCase(str.charAt(j))操作,即先轉換為同一大小寫(如小寫)後比較,若存在位置(i != j)不同但字母相同則將 isUnique 設為 false,並立即跳出循環。5.輸出答案根據boolean isUnique 的值輸出 YES 或 NO。涉及知識點:
字符串操作:
length():返回字符串的長度,用於確定循環的邊界。
charAt(int index):返回字符串指定索引位置的字符。
字符大小寫轉換:Character.toLowerCase(char c)(或 toUpperCase)將字符轉換為小寫(或大寫),確保比較時忽略大小寫差異。
(                           toLowerCase() 方法用於將大寫字符轉換為小寫。語法char toLowerCase(char ch)參數ch -- 要轉換的字符。返回值返回轉換後字符的小寫形式,如果有的話;否則返回字符本身。實例public class Test {
    public static void main(String args[]) {
        System.out.println(Character.toLowerCase('a'));
        System.out.println(Character.toLowerCase('A'));
    }
}以上程序執行結果為:
a
a
)3.雙重循環與條件判斷:通過兩層 for 循環遍歷所有字符對,結合 if 語句判斷字符是否重複,以及控制循環的提前終止(break)。完整代碼:import java.util.Scanner;
// 1:無需package
// 2: 類名必須Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此輸入您的代碼...
       String str = scan.nextLine();
        int len = str.length();
        scan.close();
        boolean isunique=true;
        for (int i = 0; i < len; i++) {
            for (int j = i+1; j < len; j++) {
                char c=Character.toLowerCase(str.charAt(i));
                char d=Character.toLowerCase(str.charAt(j));
                if ( i!=j &&c==d) {
                    isunique = false;
                    break;
                }
            }
        }
        if (isunique){
            System.out.println("YES");
        }else{
            System.out.println("NO");
        }
    }
}02確定字符串是否是另一個的排列解題思路:1.明確目標題目要求對比兩段字符串排列關係,那麼先找到核心條件長度完全相同;
字符組成完全相同(每個字符的出現次數一致,順序可不同)。
2.選擇方法使用排序比較法,即將兩個字符串轉為字符數組並排序,若排序後數組完全一致,則是排列。3.將字符串轉換為數組並排序首先使用toCharArray() 將字符串轉換為字符數組(便於對單個字符操作);然後用Arrays.sort() 對字符數組升序排序(若兩字符串是排列,排序後數組應完全相同)。4.數組相等判斷與結果輸出:使用Arrays.equals(s1, s2) 逐元素比較兩個字符數組,若完全相同則返回 true,否則返回 false。然後根據比較結果,輸出 YES(是排列)或 NO(不是排列)。5.注意導入類:import java.util.Arrays;涉及知識點:1.字符串操作:String.toCharArray() 實現字符串與字符數組的轉換。(toCharArray() 方法將字符串轉換為字符數組。語法public char[] toCharArray()參數無
返回值字符數組。實例public class Test {
    public static void main(String args[]) {
        String Str = new String("www.runoob.com");
        System.out.print("返回值 :" );
        System.out.println( Str.toCharArray() );
    }
}以上程序執行結果為:
返回值 :www.runoob.com)2.數組排序:Arrays.sort() 對字符數組的排序功能。public static void sort(Object[] a)

對指定對象數組根據其元素的自然順序進行升序排列。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。本題中所使用的Arrays.sort(char[]) 即對字符數組按 ASCII 碼升序排序。
3.數組比較:Arrays.equals(s1, s2) 逐元素比較兩個字符數組public static boolean equals(long[] a, long[] a2)

如果兩個指定的 long 型數組彼此相等,則返回 true。如果兩個數組包含相同數量的元素,並且兩個數組中的所有相應元素對都是相等的,則認為這兩個數組是相等的。換句話説,如果兩個數組以相同順序包含相同的元素,則兩個數組是相等的。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。完整代碼:import java.util.Scanner;
import java.util.Arrays;
// 1:無需package
// 2: 類名必須Main, 不可修改
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此輸入您的代碼...
        String str1= scan.nextLine();
        String str2= scan.nextLine();
        scan.close();
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        Arrays.sort(s1);
        Arrays.sort(s2);
        boolean issim = Arrays.equals(s1, s2);
        if (issim==true){
            System.out.println("YES");
        }else{
            System.out.println("NO");
        }
    }
}