• 蓝桥杯算法训练<一>


    一、图形显示

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

    问题描述
      编写一个程序,首先输入一个整数,例如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] + "	");
    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]

     
  • 相关阅读:
    3D 服务器端以向量计算为主的角色位置的算法
    宇宙中可见物质为 4%,暗物质和暗能量占 96% 是怎么算出来的?
    量子纠缠
    “人的第一感觉(直觉)其实非常准”
    有哪些看似荒谬,其实很科学的理论@知乎、@量子力学
    CPU/寄存器/内存
    原子操作
    简单的介绍下WPF中的MVVM框架
    IOS开发中,TextField和TextView有何区别
    年后小结
  • 原文地址:https://www.cnblogs.com/zhjsll/p/4412250.html
Copyright © 2020-2023  润新知