蓝桥杯算法训练<一>
一、图形显示
此题虽然简单,但是需啊哟注意的是,每个“*”后边有一个空格】
问题描述
编写一个程序,首先输入一个整数,例如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)
将这种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语言的“/”运算符,结果为整数)。
输入输出样例
输入格式:输入只有一行,即一个前缀表达式字符串。
输出格式:输出相应的计算结果(如果是除法,直接采用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。
输入输出样例
输入格式:输入有两行,分别为两个单词。
输出格式:输出只有一个字母Y或N,分别表示Yes和No。
输入输出样例
样例输入
Unclear
Nuclear
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行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
输入格式:第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
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的长度。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
八、矩阵乘法
【此题考查矩阵的乘法,如果不会矩阵的乘法的话,可以好好看看这个题,还有二维数组的运算问题】
问题描述
输入两个矩阵,分别是m*s,s*n大小。输出两个矩阵相乘的结果。
输入格式
第一行,空格隔开的三个正整数m,s,n(均不超过200)。
接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j)。
接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)。
接下来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
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
-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
3 4 0 0 2
样例输出
9 1
样例输入
7
3 2 7 5 2 9 1
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
5
3 4 0 0 2
样例输出:(输出格式说明:3为非零数据的个数,3 4 2 是以空格隔开的3个非零整数)
3
3 4 2
样例输入
7
0 0 7 0 0 9 0
0 0 7 0 0 9 0
样例输出
2
7 9
7 9
样例输入
3
0 0 0
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]
作者:无言
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎微博互粉
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。