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