日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

發布時間:2024/9/30 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 藍橋杯 Java B組 省賽決賽 真題詳解及小結匯總【2013年(第4屆)~2021年(第12屆)】
  • 第11屆 藍橋杯-第1、2次模擬(軟件類)真題-(2020年3月、4月)-官方講解視頻

  • 說明:大部分題解思路及程序代碼 源自?藍橋杯 官網視頻(Java B組歷年真題解析)?——?鄭未老師。
  • 2013年 第04屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2014年 第05屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2015年 第06屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2016年 第07屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2017年 第08屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2018年 第09屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2019年?第10屆 藍橋杯 Java B組 省賽真題詳解及小結
  • 2020年?第11屆 藍橋杯 第1次模擬賽真題詳解及小結【Java版】(校內模擬)//?官方講解視頻
  • 2020年?第11屆 藍橋杯 第2次模擬賽真題詳解及小結【Java版】//?官方講解視頻
  • 2020年?第11屆 藍橋杯 C/C++ B組 省賽真題詳解及小結【第1場省賽 2020.07.05】【Java版】
  • 2020年?第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2020.07.05】
  • 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】
  • 2020年?第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.07.05】
  • 2021年 第12屆 藍橋杯 第1次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 第2次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 第3次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 第4次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 Java B組 省賽真題詳解及小結

  • 2015年 第06屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2016年 第07屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2017年 第08屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2018年 第09屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2019年 第10屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2020年 第11屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 目錄

    模擬賽網頁截圖

    一、試題A——答案:P

    解法一:ASCII碼值對應的字符

    二、試題B——答案:16

    解法一:質數判斷

    三、試題C——答案:4042

    解法一:二叉樹節點的求解

    四、試題D——答案:25

    解法一:找規律

    解法二:BigInteger數組遍歷

    五、試題E——答案:8

    解法一

    六、試題F

    解法一

    七、試題G

    解法一

    八、試題H

    解法一

    九、試題I

    解法一

    十、試題J

    解法一

    小結


    僅供參考,歡迎指正!以下均為個人想法和解題思路,如有錯誤或不足,歡迎指正。

    模擬賽網頁截圖

    ?

    一、試題A——答案:P

    問題描述

      ASCII 碼將每個字符對應到一個數值(編碼),用于信息的表示和傳輸。在 ASCII 碼中,英文字母是按從小到大的順序依次編碼的,例如:字母 A 編碼是 65, 字母 B 編碼是 66,字母 C 編碼是 67,請編碼為 80 的是哪個字母?

    答案提交

      這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個英文字母,在提交答案時只填寫這個英文字母,填寫多余的內容將無法得分。

    解法一:ASCII碼值對應的字符

    【答案】:P

    【解析】:遞推,直接 解出 ASCII碼值 對應的字符 即可!

    package simulationMatch_12_2021_4;public class _01A {public static void main(String[] args) {System.out.println('A' - 0); // 65System.out.println('B' - 0); // 66System.out.println('C' - 0); // 67System.out.println('P' - 0); // 80System.out.println('Q' - 0); // 81System.out.println('Q' + 0); // 81System.out.println('Z' - 0); // 90} }

    二、試題B——答案:16

    問題描述

      請問在 1900 到 2020 中,有多少個質數。

    答案提交

      這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。

    解法一:質數判斷

    【答案】:16

    【解析】:for循環遍歷數據[1900, 2020],根據“質數的定義”進行求解,枚舉計數。

    package simulationMatch_12_2021_4;public class _02B {public static void main(String[] args) {int answer = 0;for (int i = 1900; i <= 2020; i++) {if (testIsPrime(i)) {answer++;}}System.out.println(answer);}public static boolean testIsPrime(int n) {if (n <= 3) {return n > 1;}for (int i = 2; i < n; i++) {if (n % i == 0)return false;}return true;}/* 優化后 */public static boolean testIsPrime2(int n) {if (n <= 3) {return n > 1;}for (int i = 2; i <= Math.sqrt(n); i++) {if (n % i == 0)return false;}return true;} }

    三、試題C——答案:4042

    問題描述

      有一棵二叉樹,有2021個葉結點。
      請問。這棵樹至少有多少個結點?

    答案提交

      這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。

    解法一:二叉樹節點的求解

    【答案】:4042

    【解析】:

    • 非空二叉樹上的葉子結點數(度為0的節點,稱為“葉子結點”)等于度為2的結點數加1,即 ?。
    • 設度為0、1、2的結點個數分別為、、,二叉樹的節點總數??。

    二叉樹的總結點個數為:

    度為2的結點數 n2 = n0 - 1 = 2021 - 1 = 2020

    葉子節點的數目為2021個(奇數),所以肯定存在度為1的節點,即 n1 = 1 。

    所以,二叉樹的總結點個數至少為:

    對于這棵二叉樹,最少的節點數目為只有度數為0和度數為2的節點,但是因為葉子節點的數目為2021個(奇數個),所以肯定存在度為1的節點,那么,最終二叉樹總的節點數目為 n = n0 + n1 + n2 = 2021 + 1 + 2020 = 4042個節點。

    四、試題D——答案:25

    問題描述

      Fibonacci序列按照如下公式定義:
      F[1] = 1
      F[2] = 1
      F[i] = F[i-1] + F[i-2] (i>2)
      前幾個 Fibonacci 數為 1, 1, 2, 3, 5, 8, 13, 21。
      請問,前100個 Fibonacci 數中,有多少個數是 3 的倍數?

    答案提交

      這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。

    解法一:找規律

    原文鏈接:百度知道——在斐波那契數列的前100個數中有多少個數是三的倍數?

    多寫幾個找規律:1、1、2、3、5、8、13、21、34、55、89、144 ...
    會發現每4個數中,會出現一個3的倍數。所以,前100個數中,3的倍數有:100÷4=25個。

    解法二:BigInteger數組遍歷

    【答案】:25

    【解析】:遍歷Fibonacci序列——Fibonacci序列的第100項數據,會爆“int型數組、long型數組”,所以要使用BigInteger數組。

    package simulationMatch_12_2021_4;import java.util.Arrays; import java.math.BigInteger;public class _04D {public static void main(String[] args) { // test1(); // test2();test3();}public static void test1() { //測試:fib[100]爆int數組int fib[] = new int[105];fib[0] = 0;fib[1] = fib[2] = 1;for (int i = 3; i <= 102; i++) {fib[i] = fib[i - 1] + fib[i - 2];}int answer = 0;for (int i = 1; i <= 100; i++) {if (fib[i] % 3 == 0) {answer++;System.out.print(i + "、");}}System.out.println("\n" + answer);System.out.println(Arrays.toString(fib));}public static void test2() { //測試:fib[100]爆long數組long fib[] = new long[102];fib[0] = 0;fib[1] = fib[2] = 1;for (int i = 3; i < 102; i++) {fib[i] = fib[i - 1] + fib[i - 2];System.out.println(i + ":" + fib[i]);} // System.out.println(Arrays.toString(fib));int answer = 0;for (int i = 1; i <= 100; i++) {if (fib[i] % 3 == 0) {answer++;System.out.print(i + "、");}}System.out.println("\n" + answer);}public static void test3() {BigInteger arr[] = new BigInteger[2025]; // int型與long型數據均會爆數組arr[0] = BigInteger.ZERO;arr[1] = arr[2] = BigInteger.ONE;for (int i = 3; i <= 2020; i++) {arr[i] = arr[i - 1].add(arr[i - 2]);}int answer = 0;BigInteger three = new BigInteger("3");for (int i = 1; i <= 100; i++) { // 輸出斐波那契數組的元素值 驗證System.out.println(i + ": " + arr[i]);if (arr[i].mod(three).equals(arr[0])) {answer++; // System.out.print(i + "、");}}System.out.println("\n" + answer);}}

    五、試題E——答案:8

    問題描述

      一個身份證號碼有 18 位數字或字母組成。其中前17位必須是數字,最后一位可能是數字或字母X。
      身份證號碼滿足一定的校驗規則。
      令身份證號從右到左依次標號為 1 到 18,其中標號為 i 的位的位權設置為 2^(i-1) mod 11 (2的i-1次方除以 11 的余數)。
      將每一位的數值乘以位權相加,得到的結果除以 11 的余數應當為 1。其中最后一位(標號為1)中如果出現字母 X,看成數字 10。
      例如,如果一個人的身份證號為 34052419800101001X,則:
      標號為 1 的位,位權 1,數值 X,即 10,相乘得 10。
      標號為 2 的位,位權 2,數值 1,相乘得 2。
      標號為 3 的位,位權 4,數值 0,相乘得 0。
      標號為 4 的位,位權 8,數值 0,相乘得 0。
      標號為 5 的位,位權 5,數值 1,相乘得 5。
      標號為 6 的位,位權 10,數值 0,相乘得 0。
      標號為 7 的位,位權 9,數值 1,相乘得 9。
      標號為 8 的位,位權 7,數值 0,相乘得 0。
      標號為 9 的位,位權 3,數值 0,相乘得 0。
      標號為 10 的位,位權 6,數值 8,相乘得 48。
      標號為 11 的位,位權 1,數值 9,相乘得 9。
      標號為 12 的位,位權 2,數值 1,相乘得 2。
      標號為 13 的位,位權 4,數值 4,相乘得 16。
      標號為 14 的位,位權 8,數值 2,相乘得 16。
      標號為 15 的位,位權 5,數值 5,相乘得 25。
      標號為 16 的位,位權 10,數值 0,相乘得 0。
      標號為 17 的位,位權 9,數值 4,相乘得 36。
      標號為 18 的位,位權 7,數值 3,相乘得 21。
      將乘積相加,得 199,除以 11 的余數正好為 1。
      小明的身份證號前 17 位為 11010120210221999,請問小明身份證的最后一位是多少?

    答案提交

      這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個字符,可能是數字或者大寫字母X,在提交答案時只填寫這個字符,填寫多余的內容將無法得分。

    解法一

    【答案】:8

    【解析】:1 ≤ i ≤ 18

    ?

    package simulationMatch_12_2021_4;public class _05E {public static void main(String[] args) { // System.out.println(Integer.MAX_VALUE); // 2147483647 // System.out.println(Long.MAX_VALUE); // 9223372036854775807 19位 // System.out.println('0' - '0'); // System.out.println('1' - '0');calculate("34052419800101001X"); // 199 1// 將每一位的數值乘以位權后相加,得到的結果除以 11 的余數應當為 1。 // calculate("110101202102219990"); // calculate("110101202102219991"); // calculate("110101202102219992"); // calculate("110101202102219993"); // calculate("110101202102219994"); // calculate("110101202102219995"); // calculate("110101202102219996"); // calculate("110101202102219997");calculate("110101202102219998"); // 221 1【答案:8】 // calculate("110101202102219999"); // calculate("11010120210221999X");}public static void calculate(String num) {StringBuilder sb = new StringBuilder(num);sb = sb.reverse();char[] charArray = sb.toString().toCharArray(); // 先轉String再轉字符數組int sum = 0;for (int i = 0; i < 18; i++) {if (i == 0) { // 計算首位if (charArray[0] == 'X') {sum += 10;} else {int place = (int) Math.pow(2, i) % 11;// 標號為 i 的位的位權設置為 2^(i-1) mod 11System.out.println(i + "---" + place + "---" + charArray[i] + "---" + ((int) (charArray[i] - '0') * place));sum += (int) (charArray[i] - '0') * place; // 將每一位的數值乘以位權后相加}} else { // 計算非首位int place = (int) Math.pow(2, i) % 11;// 標號為 i 的位的位權設置為 2^(i-1) mod 11System.out.println(i + "---" + place + "---" + charArray[i] + "---" + ((int) (charArray[i] - '0') * place));sum += (int) (charArray[i] - '0') * place; // 將每一位的數值乘以位權后相加} // System.out.println(sum + "\n\n");}System.out.println(sum);System.out.println(sum % 11);}}

    六、試題F

    問題描述

    小Hi的公司經常舉辦回饋社會的愛心活動。這次小Hi作為志愿者帶領社區的孩子們參觀了青少年天文館。他發現孩子們對于摩爾斯電碼非常感興趣。

    摩爾斯電碼由兩種基本的信號組成:短信號"滴"(用字符'.'表示)以及長信號"嗒"(用字符'-'表示)。下圖是數字0-9的摩爾斯電碼表示,每個數字都由5個字符組成:

    .---- ..--- ...-- ....- ..... -.... --... ---.. ----. ----- 1 2 3 4 5 6 7 8 9 0

    為了讓孩子們開心,小Hi決定把每位孩子的生日日期轉化為摩爾斯碼贈送給他們。例如日期20210101對應的摩爾斯電碼是:

    ..--- ----- ..--- .---- ----- .---- ----- .----

    你能寫一個程序幫助小Hi嗎?

    輸入格式

    第一行是一個整數N,代表參加活動的孩子的人數。(1 <= N <= 100)

    以下N行每行一個由0-9組成的字符串,代表一個生日日期。(日期格式:yyyymmdd,日期范圍: 20000101至20210101)

    輸出格式

    對于每個生日日期,輸出一行表示轉化后的摩爾斯碼,數字之間用一個空格隔開。

    樣例輸入

    2 20161011 20000101

    樣例輸出

    ..--- ----- .---- -.... .---- ----- .---- .---- ..--- ----- ----- ----- ----- .---- ----- .----

    解法一

    【解析】:最好將‘0’對應的字符串,設置在字符串數組的開頭位置!

    package simulationMatch_12_2021_4;import java.util.Scanner;public class _06F {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt(); // 1 <= N <= 100String str[] = { "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----." }; // 0對應的字符串在開頭for (int i = 1; i <= N; i++) { // 由0-9組成的字符串,日期范圍:20000101至20210101String s = sc.next();char strArray[] = s.toCharArray();for (int j = 0; j < 8; j++) { // [0, 8] 遍歷字符數組,取出每一個字符int index = (int) (strArray[j] - '0'); // 字符串數組的下標if (j == 7) { // 若是輸出最后的字符串,則末尾不加空格System.out.print(str[index]);} else {System.out.print(str[index] + " ");}}System.out.println();}} }

    七、試題G

    問題描述

      小藍在商店買文具。
      一支鋼筆 x 元,小藍買了 a 支。
      一個筆記本 y 元,小藍買了 b 本。
      請問,小藍一共需要支付多少錢?

    輸入格式

      輸入四行。
      第一行包含一個整數 x。
      第二行包含一個整數 a。
      第三行包含一個整數 y。
      第四行包含一個整數 b。

    輸出格式

      輸出一個整數,表示答案。

    樣例輸入

    5
    2
    1
    6

    樣例輸出

    16

    樣例輸入

    2
    0
    2
    1

    樣例輸出

    2

    數據規模和約定

      對于所有評測用例,0 <= x, a, y, b <= 100。

    解法一

    package simulationMatch_12_2021_4;import java.util.Scanner;public class _07G {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int x = sc.nextInt();int a = sc.nextInt();int y = sc.nextInt();int b = sc.nextInt();System.out.println(x * a + y * b);}}

    八、試題H

    問題描述

      給定一個序列 (a_1, a_2, ..., a_n), 定義序列中的一個遞增三元組是指三個下標 i, j, k 對應的三個元素 a_i, a_j, a_k,這三個元素滿足 a_i < a_j < a_k。
      例如序列 (1, 1, 4, 3, 2, 4) 有以下 4 個遞增三元組:
      1. 下標 1, 4, 6 對應的 1, 3, 4;
      2. 下標 1, 5, 6 對應的 1, 2, 4;
      3. 下標 2, 4, 6 對應的 1, 3, 4;
      4. 下標 2, 5, 6 對應的 1, 2, 4。
      注意,可能有下標不同,但對應數值相同的三元組,他們應當算成不同的三元組。
      給定序列,請問序列中一共有多少個不同的遞增三元組。

    輸入格式

      輸入第一行包含一個整數 n,表示序列的長度。
      第二行包含 n 個整數 a_1, a_2, ..., a_n,表示給定的序列。

    輸出格式

      輸出一行,包含一個整數,表示序列中的遞增三元組數量。請注意答案可能很大,可能超過 32 位二進制整數的范圍,建議使用 64 位二進制整數。

    樣例輸入

    6
    1 1 4 3 2 4

    樣例輸出

    4

    數據規模和約定

      對于 30% 的評測用例,1 <= n <= 20, 0 <= a_i <= 10。
      對于 50% 的評測用例,1 <= n <= 1000, 0 <= a_i <= 100。
      對于 80% 的評測用例,1 <= n <= 10000, 0 <= a_i <= 100。
      對于所有評測用例,1 <= n <= 100000, 0 <= a_i <= 100。

    解法一

    【解析】:三個元素滿足 a_i < a_j < a_k

    for (int i = 0; i < n; i++) {
    ?? ??? ??? ?for (int j = i + 1; j < n; j++) {
    ?? ??? ??? ??? ?for (int k = j + 1; k < n; k++) {

    package simulationMatch_12_2021_4;import java.util.Arrays; import java.util.Scanner;public class _08H {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int array[] = new int[n + 1];for (int i = 0; i < n; i++) {array[i] = sc.nextInt();} // System.out.println(Arrays.toString(array));Long answer = 0L; // 答案可能很大,建議使用64位二進制整數for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {for (int k = j + 1; k < n; k++) {if (array[i] < array[j] && array[j] < array[k]) {answer++;}}}}System.out.println(answer);}}

    九、試題I

    問題描述

      小Hi正在研究一種特殊的棧。這種棧的元素既可以從棧頂出棧,也可以從棧底出棧。(進棧還是只能從棧頂進棧)
      已知入棧的序列是1~N的一個排列,請你判斷出棧序列能否是1, 2, 3, ... N?

    輸入格式

      輸入包含多組數據。
      輸入第一行包含一個整數T,代表測試數據的組數。
      以下每組數據占據2行。
      第一行包含一個整數N。
      第二行包含N個整數,整數中由空格隔開。表示入棧序列。

    輸出格式

      對于每組數據輸出YES或者NO,代表出棧序列能否是1, 2, 3, ... N。

    樣例輸入

    2
    5
    2 4 1 3 5
    5
    4 3 1 5 2

    樣例輸出

    YES
    NO

    數據規模和約定

      對于30%的評測用例,1 <= N <= 10
      對于80%的評測用例,1 <= N <= 10000
      對于所有評測用例,1 <= N <= 100000, 1 <= T <= 10。

    解法一

    求巨佬支招!

    十、試題J

    問題描述

      給定兩個序列 A=(a_1, a_2, ..., a_n) 和 B=(b_1, b_2, ..., b_m), 它們的一個公共子序列是指從兩個序列中分別取出相同個數的元素,按照原來的順序排列后,對應位置的數值相等。
      例如,對于序列 A=(3, 2, 7, 6, 7) 和 B=(2, 3, 5, 7),可以在序列 A 中取出第 2, 3 個元素,在序列 B 中取出第 1, 4 個元素,值都是 2, 7,因此 2, 7 是一個公共子序列,在 A 中取第 2, 3 個元素和在 B 中取 1, 4 個元素是這個公共子序列的一種取法。
      在這兩個序列中,有 4 中取法可以取出長度為 2 的公共子序列,例如
      1. 在 A 中取第 1, 3 個元素,在 B 中取 2, 4 個元素;
      1. 在 A 中取第 1, 5 個元素,在 B 中取 2, 4 個元素;
      1. 在 A 中取第 2, 3 個元素,在 B 中取 1, 4 個元素;
      1. 在 A 中取第 2, 5 個元素,在 B 中取 1, 4 個元素。
      給定兩個序列,請問有多少種取法可以取出長度為 k 的公共子序列。

    輸入格式

      輸入第一行包含三個整數 n, m, k,分別表示序列 A 的長度、序列 B 的長度和公共子序列的長度。
      第二行包含 n 個整數 a_1, a_2, ..., a_n,表示給定的 A 序列。
      第三行包含 m 個整數 b_1, b_2, ..., b_m,表示給定的 B 序列。

    輸出格式

      輸出一行,包含一個整數,表示長度為 k 的公共子序列的數量,答案可能很大,請輸出答案除以 1000007 的余數。

    樣例輸入

    5 4 2
    3 2 7 6 7
    2 3 5 7

    樣例輸出

    4

    數據規模和約定

      對于 30% 的評測用例,1 <= n, m <= 20。
      對于 50% 的評測用例,1 <= n, m <= 100。
      對于所有評測用例,1 <= n, m <= 1000, 1 <= k <= 10, 0 <= a_i <= 100。

    解法一

    求巨佬支招!

    小結

    手寫計算的題目,可以“編程+計算”進行求解驗證。
    藍橋杯比賽時,時間緊迫,在保證正確率的情況下,寫快一些,然后多檢查幾遍。

    藍橋杯?斐波那契數列前100項,BigInteger數組模板

    總結

    以上是生活随笔為你收集整理的2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。