12.5MB
1 2 3 4
   | 【问题描述】 在计算机存储中,12.5MB是多少字节? 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
   | 
第一题没什么难度就是计算,1MB=1024KB,1KB=1024Byte,所以直接计算器,答案为13,107,200
最多边数
1 2 3 4
   | 【问题描述】 一个包含有2019个结点的有向图,最多包含多少条边?(不允许有重边) 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
   | 
边数最多,那就是有向完全图了,所以根据数据结构的知识,含有n个节点的有向完全图,边数为n*(n-1)。所以答案为4074342。
单词重排
1 2 3 4 5
   | 【问题描述】 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。 请问,总共能排列如多少个不同的单词。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
   | 
这明显就是全排序的题目,所以用全排序的算法就可以得出结果。
解法一
我一开始看到这填空题才是七个数的全排列,就直接笔算了,全排列后的种数为7!。因为题目里的这七个字母有两个是一样的,所以全排列后除2就可以得到答案2520。
解法二
第二种是在网上看到的灵感,就是先实现全排列,然后加入到set集合里去重,最后也可以得到正确答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
   | import java.util.HashSet; import java.util.Set;
  public class Solution {     static char[] arr = "LANQIAO".toCharArray();     static Set<String> res = new HashSet<>(); 	     public static void Permutation(char[] arr,int start,int end){         if (end <= 1) {             return;         }         if (start == end) {             res.add(new String(arr));         }         else{             for (int i = 0; i <= end; i++) {                 swapchar(arr,i,start);                 Permutation(arr,start+1,end);                 swapchar(arr,i,start);             }         }
      }     public static void swapchar(char[] arr,int a,int b){         char t = arr[a];         arr[a] = arr[b];         arr[b] = t;     }
      public static void main(String[] args) {         Permutation(arr, 0, 6);         System.out.println(res.size());     } }
   | 
括号序列
1 2 3 4 5 6
   | 【问题描述】 由1对括号,可以组成一种合法括号序列:()。 由2对括号,可以组成两种合法括号序列:()()、(())。 由4对括号组成的合法括号序列一共有多少种? 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
   | 
解法一
这道题我一开始看的想法就是左括号和右括号看成0和1,然后直接枚举暴力破解,因为第一个肯定是左括号,最后一个肯定是右括号,所以输出了64种,一种种排除几分钟也能得到正确答案14种。
这种方法比较蠢,上了几个for循环,我就不放代码了。
解法二
在网上找到的一种方法。这其实是卡特兰数的一种应用(可以去百度了解一下) 。
S(n) = S(0)S(n-1) + S(1)S(n-2) + ….. + S(n-1)S(0)
所以就可以直接套公式了。
- 当有0对括号的时候,有1种序列
 - 当有1对括号的时候,有1种序列
 - 当有2对括号的时候,有2种序列
 - 当有3对括号的时候,有5种序列
 
所以代进去就能得到答案为14,代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | public class Solution {
      public static void main(String[] args) {         System.out.println(Catalan(4));     }
      public static int Catalan(int k){         if(k<=1){             return 1;         }         int[] res = new int[k+1];         res[0] = 1;         res[1] = 1;         for (int i = 2; i <= k; i++) {             for (int j = 0; j < i; j++) {                 res[i] = res[i] + (res[j] * res[i - j - 1]);             }         }         return res[k];     } }
  | 
反倍数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | 【问题描述】 给定三个整数 a, b, c,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不是 c 的整数倍,则这个数称为反倍数。 请问在 1 至 n 中有多少个反倍数。 【输入格式】 输入的第一行包含一个整数 n。 第二行包含三个整数 a, b, c,相邻两个数之间用一个空格分隔。 【输出格式】 输出一行包含一个整数,表示答案。 【样例输入】 30 2 3 6 【样例输出】 10 【样例说明】 以下这些数满足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。 【评测用例规模与约定】 对于 40% 的评测用例,1 <= n <= 10000。 对于 80% 的评测用例,1 <= n <= 100000。 对于所有评测用例,1 <= n <= 1000000,1 <= a <= n,1 <= b <= n,1 <= c <= n。
   | 
这题也没什么技巧,最大的数据也只有1000000,所以一个for循环加个if判断语句就可以暴力破解了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | public class Solution {     public static void main(String[] args) {         int res = 0;         Scanner scanner = new Scanner(System.in);         int n = scanner.nextInt();         int a = scanner.nextInt();         int b = scanner.nextInt();         int c = scanner.nextInt();         for (int i = 1; i <= n; i++) {             if(i%a!=0&&i%b!=0&&i%c!=0) {                 res++;             }         }         System.out.println(res);     } }
  | 
凯撒加密
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | 【问题描述】 给定一个单词,请使用凯撒密码将这个单词加密。 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,...,w变为z,x变为a,y变为b,z变为c。 例如,lanqiao会变成odqtldr。 【输入格式】 输入一行,包含一个单词,单词中只包含小写英文字母。 【输出格式】 输出一行,表示加密后的密文。 【样例输入】 lanqiao 【样例输出】 odqtldr 【评测用例规模与约定】 对于所有评测用例,单词中的字母个数不超过100。
   | 
凯撒密码从c敲到Java,常见的题,我不是太清楚这个单词的结构,我默认它是一长串连续的字母组成的字符串,没有空格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | public class Solution {     public static void main(String[] args) {         Scanner scanner = new Scanner(System.in);         String str = scanner.nextLine();         char[] arr = str.toCharArray();         for(char c:arr) {             if (c == 'x') {                 System.out.print('a');             }             if (c == 'y') {                 System.out.println('b');             }             if (c == 'z') {                 System.out.println('c');             }             System.out.print((char) (c + 3));         }     } }
  | 
螺旋
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | 【问题描述】 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7 12 11 10 9 8 【输入格式】 输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。 第二行包含两个整数 r, c,表示要求的行号和列号。 【输出格式】 输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。 【样例输入】 4 5 2 2 【样例输出】 15 【评测用例规模与约定】 对于 30% 的评测用例,2 <= n, m <= 20。 对于 70% 的评测用例,2 <= n, m <= 100。 对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。
   | 
这个题目难点就是求出这个数组,我们可以螺旋递增来求出这个数组,然后再输出r行c列的值就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
   | public class Solution {
      public static void main(String[] args) {         Scanner scanner = new Scanner(System.in);         int k = 1,x=0,y = 0;         int n = scanner.nextInt();         int m = scanner.nextInt();         int r = scanner.nextInt();         int c = scanner.nextInt();         int[][] arr = new int[n][m];         arr[0][0] = k;         while(n*m>k){                          while (y + 1 < m && arr[x][y + 1]==0) {                 arr[x][y+1] = ++k;                 y++;             }                          while (x + 1 < n && arr[x+1][y]==0) {                 arr[x+1][y] = ++k;                 x++;             }                          while (y-1 >= 0 && arr[x][y-1]==0) {                 arr[x][y-1] = ++k;                 y--;             }                          while (x-1 >= 0 && arr[x-1][y]==0) {                 arr[x-1][y] = ++k;                 x--;             }         }             System.out.println(arr[r-1][c-1]);     } }
  | 
摆动序列
通电
植树