1.第一题送分
2.一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001 有多少个不同的非空子串?
Ps:要注意下一层循环的内层循环应该小于等于s.length(),因为s.substring的范围是【)左闭右开.
/*
*重点在于对String求字串有个subString的方法,其中参数(int start,int end)
*范围是[start,end);所以在写代码时候要注意for循环的区间,
*第二次for循环应该小于等于str的长度
*当然对于其中有多少个不同的字串,可以用HashSet存储过滤。
*得出的set.size()即为不同子串的数目
**/
public static void main(String[] args) {
String s ="0100110001010001";
HashSet<String> set = new HashSet<String>();
for (int i = 0; i < s.length(); i++) {
for (int j = i+1; j <= s.length(); j++) {
String a = s.substring(i,j);
set.add(a);
}
}
System.out.println(set.size());
}
3.给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
审题:题目给出最后四位数那么该规律应该只是和最后四位数有关所以给个for循环求后四位数即%10000.
public static void main(String[] args) {
int a = 1, b = 1,c = 1;
for (int i = 3; i < 20190324; i++) {
int temp = (a + b + c) % 10000;
a = b;
b = c;
c = temp;
}
System.out.println(c);
}
4.把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
Ps:暴力for循环三个数,然后要注意三个数都要不相同,那么for循环中控制为上一层加1,保证三个数不相等。
public static void main(String[] args) {
int count = 0;
int target = 2019;
//for循环控制三个数字
for (int i = 1; i < target; i++) {
//当indexOf找到相应的值后返回索引下标,当不等于-1的时候相当于找到了2和4
if((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1)
continue;
for (int j = i + 1; j < target; j++) {
if((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1)
continue;
for (int k = j + 1; k < target; k++) {
if((k + "").indexOf("2") != -1 || (k + "").indexOf("4") != -1)
continue;
if(i + j + k == target)
count++;
}
}
}
System.out.println(count);
}
5.下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。
010000 000100 001001 110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。
PS:因为之前做过类似的迷宫问题,当时学习的是dfs,回溯算法。由于迷宫过大,dfs可能会超时所以使用BFS广度优先遍历(网上大多都是用这个)
(先跳过回头再看,填空保证前四没问题)
6.小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少?
PS:对于字符串的操作还不够熟练,可以将数字转化为字符串进行操作。去判断下标位数的问题
public static void main(String[] args) {
int sum = 0;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
if((i + "").indexOf("2") != -1 || (i + "").indexOf("0") != -1 || (i + "").indexOf("1") != -1 || (i + "").indexOf("9") != -1)
sum += i;
}
System.out.println(sum);
}
7.饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。
PS:总结坑节点:优先级队列中也有先后顺序,同时对HashMap不熟练,例如HashMap<Integer,ArrayList>这些操作不熟练,这在redis中经常存放并且用expire设置过期时间
8.输入一行K整数,输入一行字符串如下:
This is a story about Alice and Bob.Alice wants to send aprivate message to Bob.
- 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
- 输出一个整数,表示 Alice 和 Bob 同时出现的次数。
PS:一开始在别人的题目中看到的是一长串字符串,完全没有头绪,但查找过后发现题目其实就是一个英文句子然后进行分割,统计固定单词之间单词书,要说坑点,也还是对字符串的一些API不熟悉,repalceAll("\,",“替换字符串”),以及split后正则表达式("\s+"),以及trim()
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
scanner.nextLine();
String string = scanner.nextLine();
string = string.replaceAll("\\.", " ab ");
string = string.trim();
//以空格分割字符串,得到字符串数组,首部的空格没有去掉
String[] strs = string.split("\\s+");