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 ]); } }
摆动序列 通电 植树