藍橋杯算法訓練<一>


一、圖形顯示

此題雖然簡單,但是需啊喲注意的是,每個“*”后邊有一個空格】

問題描述
  編寫一個程序,首先輸入一個整數,例如5,然后在屏幕上顯示如下的圖形(5表示行數):
  * * * * *
  * * * *
  * * *
  * *
  *
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner mScanner = new Scanner(System.in);
 6         int n = mScanner.nextInt();
 7         for (int i = n; i > 0; i--) {
 8             if (i != n) {
 9                 System.out.println();
10             }
11             for (int j = 0; j < i; j++) {
12                 System.out.print("* ");
13             }
14         }
15     }
16 }

 二、排序

【由小到大排序后逆序輸出】
問題描述
  編寫一個程序,輸入3個整數,然后程序將對這三個整數按照從大到小進行排列。
  輸入格式:輸入只有一行,即三個整數,中間用空格隔開。
  輸出格式:輸出只有一行,即排序后的結果。
  輸入輸出樣例
樣例輸入
  9 2 30
樣例輸出
  30 9 2
 
 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 public class Main{
 5 
 6     public static void main(String[] args) {
 7         Scanner mScanner = new Scanner(System.in);
 8         int[] array = new int[3];
 9         for (int i = 0; i < array.length; i++) {
10             array[i] = mScanner.nextInt();
11         }
12         Arrays.sort(array);
13         for (int i = array.length - 1; i >= 0; i--) {
14             System.out.print(array[i] + " ");
15         }
16     }
17 
18 }

 

三、2的次冪表示

【這個是從網上找的一個答案,通過測試】
問題描述
  任何一個正整數都可以用2進制表示,例如:137的2進制表示為10001001。
  將這種2進制表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0
  現在約定冪次用括號來表示,即a^b表示為a(b)
  此時,137可表示為:2(7)+2(3)+2(0)
  進一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0 
  所以最后137可表示為:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示為:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
輸入格式
  正整數(1<=n<=20000)
輸出格式
  符合約定的n的0,2表示(在表示中不能有空格)
樣例輸入
  137
樣例輸出
  2(2(2)+2+2(0))+2(2+2(0))+2(0)
樣例輸入
  1315
樣例輸出
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
  用遞歸實現會比較簡單,可以一邊遞歸一邊輸出
 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public void fun(double e) {
 5         double d = e;
 6         if (d == 1) {
 7             System.out.print("2(0)");
 8         } else {
 9             if (d == 2) {
10                 System.out.print("2");
11             } else {
12                 int x = 1;
13                 int m = 0;
14                 while (m == 0) {
15                     if ((Math.pow(2, x + 1) > d) && (d >= Math.pow(2, x))) {
16                         m = 1;
17                         if (d == Math.pow(2, x)) {
18                             System.out.print("2");
19                             if (x == 1) {
20                             } else {
21                                 System.out.print("(");
22                                 fun(x);
23                                 System.out.print(")");
24                             }
25                         } else {
26                             System.out.print("2");
27                             if (x == 1) {
28                             } else {
29                                 System.out.print("(");
30                                 fun(x);
31                                 System.out.print(")");
32                             }
33                             System.out.print("+");
34                             fun(d - Math.pow(2, x));
35                         }
36                     } else {
37                         x++;
38                     }
39                 }
40             }
41         }
42     }
43 
44     public static void main(String[] args) {
45         Scanner mScanner = new Scanner(System.in);
46         double n = mScanner.nextInt();
47         Main cm = new Main();
48         cm.fun(n);
49     }
50 }

 

四、前綴表達式

【此題貌似沒有按照題中要求的設計相應的函數,但是也通過了測試】
問題描述
  編寫一個程序,以字符串方式輸入一個前綴表達式,然后計算它的值。輸入格式為:“運算符 對象1 對象2”,其中,運算符為“+”(加法)、“-”(減法)、“*”(乘法)或“/”(除法),運算對象為不超過10的整數,它們之間用一個空格隔開。要求:對於加、減、乘、除這四種運算,分別設計相應的函數來實現。
  輸入格式:輸入只有一行,即一個前綴表達式字符串。
  輸出格式:輸出相應的計算結果(如果是除法,直接采用c語言的“/”運算符,結果為整數)。
  輸入輸出樣例
樣例輸入
  + 5 2
樣例輸出
  7
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     
 5     public static void main(String[] args) {
 6         Scanner mScanner = new Scanner(System.in);
 7         String mm = mScanner.next();
 8         int a = mScanner.nextInt();
 9         int b = mScanner.nextInt();
10         if (mm.equals("+")) {
11             System.out.println(a+b);
12         }else if (mm.equals("-")) {
13             System.out.println(a-b);
14         }else if (mm.equals("*")) {
15             System.out.println(a*b);
16         }else if (mm.equals("/")) {
17             System.out.println(a/b);
18         }
19     }
20 }

 

五、Anagrams問題

【我的做法是先把輸入的字符串使用 toLowerCase() 函數全部轉化為小寫字母,然后使用排序函數對字符數組進行排序,最后依次比較每個字符的大小即可!】
問題描述
  Anagrams指的是具有如下特性的兩個單詞:在這兩個單詞當中,每一個英文字母(不區分大小寫)所出現的次數都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。編寫一個程序,輸入兩個單詞,然后判斷一下,這兩個單詞是否是Anagrams。每一個單詞的長度不會超過80個字符,而且是大小寫無關的。
  輸入格式:輸入有兩行,分別為兩個單詞。
  輸出格式:輸出只有一個字母Y或N,分別表示Yes和No。
  輸入輸出樣例
樣例輸入
  Unclear
  Nuclear
樣例輸出
  Y
 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 public class Main{
 5 
 6     public static void main(String[] args) {
 7         Scanner mScanner = new Scanner(System.in);
 8         String str1 = mScanner.next().toLowerCase();
 9         String str2 = mScanner.next().toLowerCase();
10         if (str1.length() == str2.length()) {
11             char[] arr1 = fun(str1);
12             char[] arr2 = fun(str2);
13             boolean tag = true;
14             for (int i = 0; i < arr1.length; i++) {
15                 if (arr1[i] != arr2[i]) {
16                     tag = false;
17                 }
18             }
19             if (tag) {
20                 System.out.println("Y");
21             }else{
22                 System.out.println("N");
23             }
24         } else {
25             System.out.println("N");
26         }
27     }
28 
29     public static char[] fun(String str) {
30         char[] array = str.toCharArray();
31         Arrays.sort(array);
32         return array;
33     }
34 
35 }

 

六、出現次數最多的整數

【此題沒有太大難度,但是如果考慮的不全面的話想得100分也有點難度,問題是他給出的測試的數據中給出的測試數值小於或者等於1,大於20……這就是一個坑。。。】
問題描述
  編寫一個程序,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數N也是由用戶輸入的,最多不會超過20。然后程序將對這個數組進行統計,把出現次數最多的那個數組元素值打印出來。如果有兩個元素值出現的次數相同,即並列第一,那么只打印比較小的那個值。
  輸入格式:第一行是一個整數N,N   £  20;接下來有N行,每一行表示一個整數,並且按照從小到大的順序排列。
  輸出格式:輸出只有一行,即出現次數最多的那個元素值。
  輸入輸出樣例
樣例輸入
  5
  100
  150
  150
  200
  250
樣例輸出
  150
 1 import java.util.Scanner;
 2 
 3 public class Main{
 4 
 5     public static void main(String[] args) {
 6         Scanner mScanner = new Scanner(System.in);
 7         int m = mScanner.nextInt();
 8         if (m < 1 || m > 20) {
 9             return;
10         }
11         int[] array = new int[m];
12         for (int i = 0; i < m; i++) {
13             array[i] = mScanner.nextInt();
14         }
15 
16         int max = 0;
17         int tag = 0;
18         int num = 0;
19         for (int i = 1; i < array.length; i++) {
20             if (array[i - 1] == array[i]) {
21                 tag++;
22             } else {
23                 tag = 0;
24             }
25             if (tag > max) {
26                 num = array[i];
27                 max = tag;
28             }
29         }
30         if (num==0) {
31             num = array[0];
32         }
33         System.out.println(num);
34     }
35 
36 }

 

七、字串統計

問題描述
  給定一個長度為n的字符串S,還有一個數字L,統計長度大於等於L的出現次數最多的子串(不同的出現可以相交),如果有多個,輸出最長的,如果仍然有多個,輸出第一次出現最早的。
輸入格式
  第一行一個數字L。
  第二行是字符串S。
  L大於0,且不超過S的長度。
輸出格式
  一行,題目要求的字符串。

  輸入樣例1:
  4
  bbaabbaaaaa

  輸出樣例1:
  bbaa

  輸入樣例2:
  2
  bbaabbaaaaa

  輸出樣例2:
  aa
數據規模和約定
  n<=60
  S中所有字符都是小寫英文字母。

  提示
  枚舉所有可能的子串,統計出現次數,找出符合條件的那個
 
 

八、矩陣乘法

【此題考查 矩陣的乘法,如果不會矩陣的乘法的話,可以好好看看這個題,還有 二維數組的運算問題】
問題描述
  輸入兩個矩陣,分別是m*s,s*n大小。輸出兩個矩陣相乘的結果。
輸入格式
  第一行,空格隔開的三個正整數m,s,n(均不超過200)。
  接下來m行,每行s個空格隔開的整數,表示矩陣A(i,j)。
  接下來s行,每行n個空格隔開的整數,表示矩陣B(i,j)。
輸出格式
  m行,每行n個空格隔開的整數,輸出相乘後的矩陣C(i,j)的值。
樣例輸入
  2 3 2
  1 0 -1
  1 1 -3
  0 3
  1 2
  3 1
樣例輸出
  -3 2
  -8 2

提示
  矩陣C應該是m行n列,其中C(i,j)等於矩陣A第i行行向量與矩陣B第j列列向量的內積。
  例如樣例中C(1,1)=(1,0,-1)*(0,1,3) = 1 * 0 +0*1+(-1)*3=-3
 1 import java.util.Scanner;
 2 
 3 
 4 public class Main {
 5 
 6     public static void main(String[] args) {
 7         Scanner mScanner = new Scanner(System.in);
 8         int m = mScanner.nextInt();
 9         int s = mScanner.nextInt();
10         int n = mScanner.nextInt();
11         int[][] a = new int[m][s];
12         int[][] b = new int[s][n];
13         int[][] c = new int[m][n];
14         for (int i = 0; i < m; i++) {
15             for (int j = 0; j < s; j++) {
16                 a[i][j] = mScanner.nextInt();
17             }
18         }
19         for (int i = 0; i < s; i++) {
20             for (int j = 0; j < n; j++) {
21                 b[i][j] = mScanner.nextInt();
22             }
23         }
24         
25         getMatrix(a, b);
26         
27     }
28 
29     public static void getMatrix(int[][] a, int[][] b) {
30         int[][] c = new int[a.length][b[0].length];
31         for (int i = 0; i < a.length; i++) {
32             for (int j = 0; j < b[0].length; j++) {
33                 int sum = 0;
34                 for (int k = 0; k < b.length; k++) {
35                     sum += a[i][k] * b[k][j];
36                 }
37                 c[i][j] = sum;
38             }
39         }
40 
41         for (int i = 0; i < a.length; i++) {
42             for (int j = 0; j < b[0].length; j++) {
43                 System.out.print(c[i][j] + "\t");
44             }
45             System.out.println();
46         }
47 
48     }
49 
50 }

 

九、大小寫轉換

大小寫轉換函數,字符串到字符數組的轉化函數
問題描述
  編寫一個程序,輸入一個字符串(長度不超過20),然后把這個字符串內的每一個字符進行大小寫變換,即將大寫字母變成小寫,小寫字母變成大寫,然后把這個新的字符串輸出。
  輸入格式:輸入一個字符串,而且這個字符串當中只包含英文字母,不包含其他類型的字符,也沒有空格。
  輸出格式:輸出經過轉換后的字符串。
  輸入輸出樣例
樣例輸入
  AeDb
樣例輸出
  aEdB
 1 import java.util.Scanner;
 2 public class Main {
 3 
 4     public static void main(String[] args) {
 5         Scanner mScanner = new Scanner(System.in);
 6         String str = mScanner.next();
 7         char[] arr = str.toCharArray();
 8         for (int i = 0; i < arr.length; i++) {
 9             if (Character.isLowerCase(arr[i])) {
10                 str = String.valueOf(arr[i]).toUpperCase();
11             } else {
12                 str = String.valueOf(arr[i]).toLowerCase();
13             }
14             System.out.print(str);
15         }
16     }
17 
18 }

 

十、動態數組使用

【此題可以考慮使用arrayList動態鏈表!】
 從鍵盤讀入n個整數,使用動態數組存儲所讀入的整數,並計算它們的和與平均值分別輸出。要求盡可能使用函數實現程序代碼。平均值為小數的只保留其整數部分。
樣例輸入
  5
  3 4 0 0 2
樣例輸出
  9 1
樣例輸入
  7
  3 2 7 5 2 9 1
樣例輸出
  29 4
 1 import java.util.ArrayList;
 2 import java.util.Scanner;
 3 
 4 public class Main {
 5 
 6     public static void main(String[] args) {
 7         Scanner mScanner = new Scanner(System.in);
 8         int length = mScanner.nextInt();
 9 
10         int sum = 0;
11         int average = 0;
12         for (int i = 0; i < length; i++) {
13             sum = sum + mScanner.nextInt();
14         }
15         System.out.println(sum + " " + sum / length);
16 
17     }
18 
19 }

 

十一、刪除數組零元素

【此題如果使用數組的話可能比較麻煩,但是使用  ArrayList 的話就能達到事半功倍的效果
  從鍵盤讀入n個整數放入數組中,編寫函數CompactIntegers,刪除數組中所有值為0的元素,其后元素向數組首端移動。注意,CompactIntegers函數需要接受數組及其元素個數作為參數,函數返回值應為刪除操作執行后數組的新元素個數。輸出刪除后數組中元素的個數並依次輸出數組元素。  樣例輸入: (輸入格式說明:5為輸入數據的個數,3 4 0 0 2 是以空格隔開的5個整數)
  5
  3 4 0 0 2
  樣例輸出:(輸出格式說明:3為非零數據的個數,3 4 2 是以空格隔開的3個非零整數)
  3
  3 4 2
樣例輸入
  7
  0 0 7 0 0 9 0
樣例輸出
  2
  7 9
樣例輸入
  3
  0 0 0
樣例輸出
  0
 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.Scanner;
 4 
 5 
 6 public class Main {
 7 
 8     public static void main(String[] args) {
 9 
10         Scanner mScanner = new Scanner(System.in);
11         int count = mScanner.nextInt();
12 
13         List<Integer> list = new ArrayList<Integer>();
14 
15         // int[] arr = new int[count];
16         for (int i = 0; i < count; i++) {
17             // arr[i] = mScanner.nextInt();
18             list.add(mScanner.nextInt());
19         }
20         int length = CompactIntegers(list, count);
21         System.out.println(length);
22 
23         for (int i = 0; i < list.size(); i++) {
24             System.out.print(list.get(i) + " ");
25         }
26 
27     }
28 
29     public static int CompactIntegers(List<Integer> list, int count) {
30         int ss = count;
31         for (int i = 0; i < list.size(); i++) {
32             if (list.get(i) == 0) {
33                 list.remove(i);
34                 ss--;
35                 i--;
36             }
37         }
38         return ss;
39     }
40 }

注:本文系原創,首發於博客園,轉載請注明出處。[http://www.cnblogs.com/zhjsll/p/4412250.html]

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM