蓝桥杯算法训练<一>

一、图形显示【此题虽然简单,但是需啊哟注意的是,每个“*”后边有一个空格】

问题描述

  编写一个程序,首先输入一个整数,例如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 }

注:本文系原创,首发于博客园,转载请注明出处。

时间: 2024-10-13 02:05:45

蓝桥杯算法训练<一>的相关文章

蓝桥杯算法训练&lt;二&gt;

一.最小乘积(基本型)[这个题需要认真阅读试题,内容量较大,刚开始的时候,由于练习系统上给出的输入输出的格式有问题,没看懂,最后在MikCu的博客上看到了正确的格式,参考了代码,最终得到正确的结果.为了让结果最小,可以先分别对两组数进行排序,然后对其中的一组数据逆序,逆序后,把两组数据最大的与最小的相乘,最后求得的和最小!] 问题描述 给两组数,各n个. 请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小.要求程序输出这个最小值. 例如两组数分别为:1 3 -5和-2 4

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3

蓝桥杯 算法训练 ALGO-57 删除多余括号

算法训练 删除多余括号 时间限制:1.0s   内存限制:512.0MB 问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简.另外不考虑'+' '-'用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形. 输入格式 表达式字符串,长度不超过255, 并且不含空格字符.表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘*除/等运算符号. 输出格式 去掉多余括号后的表达式

蓝桥杯 算法训练 ALGO-36 传纸条

算法训练 传纸条 时间限制:1.0s   内存限制:512.0MB 问题描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在

蓝桥杯 算法训练 ALGO-125 王、后传说

算法训练 王.后传说 时间限制:1.0s   内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办法. 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个).当然,皇后也不会攻击国王.

蓝桥杯 算法训练 ALGO-139 s01串

算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述  s01串初始为"0"  按以下方式变换  0变1,1变01 输入格式  1个整数(0~19) 输出格式  n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定  0~19 示例代码: 1 import java.util.Scanner; 2 3 public class Main { 4 static StringBuffer sb = new StringBuffer(); 5 public

蓝桥杯 算法训练 2的次幂表示

算法训练 2的次幂表示 时间限制:1.0s   内存限制:512.0MB 问题描述 任何一个正整数都可以用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))+

蓝桥杯 算法训练 最短路

算法训练 最短路 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出格式 共n-1行,第i行表示1号点到i+1号点的最短路. 样例输入 3 31 2 -12 3 -13 1 2 样例输出 -1-2 数据规模与约定 对于10%的数据,n = 2,

蓝桥杯 算法训练 ALGO-117 友好数

算法训练 友好数 时间限制:1.0s   内存限制:256.0MB 问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的. 220的约数和有:1 2 4 5 10 11 20 22 44 55 110=284 284的约数和有:1 2 4 71 142=220 所以220和284是友好的. 编写程序,判断两个数是否是友好数. 输入格式 一行,两个整数,由空格分隔 输出格式 如