前几天面完了306,今天同学做了360正常批次的笔试,记录一下题目,报的是Java的后端,40个选择题包含很多内容,C++,数学,数据结构,Linux,设计模式,数据库各式各样。
两个编程题,第一题的比较简单,第二题有些难
第一题 寻找子串
大意就是给出一个字符串S,找出这个字符串的所有子串中出现次数最多的子串,输出踏出现的个数。
输入:
共一行,一个字符串s,仅有英文小写字母组成,s的长度不超过10000.
输出:
一个正整数,表示最大出现次数。
样例输入:
aba
样例输出:
2
提示:aba的所有子串为 a,b,a,ab,ba,aba,其中a出现的次数最多,出现了两次。
题目分析:
一开始感觉题目有些难,因为子串太多了,想用暴力实现去比较。但是后面突然想到最多的出现的子串,必然包含相同的字符,那么最小的子串其实就是一个字符,其实题目就可以理解成是一个字符串中单个字符的最多出现的次数。
代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String []args){
Scanner in = new Scanner(System.in);
String string = in.next();
int count [] = new int [26];
Arrays.fill(count,0);
for(int i = 0;i<string.length();i++){
count[string.charAt(i)-'a']++;
}
//find max
int max = 0;
for(int i =0;i<26;i++){
if(max<count[i])
max = count[i];
}
System.out.println(max);
}
}
第二题:散步
小名每天都在一条笔直的路上散步,起点在路上某处,但是因为路上没有标识,他并不知道这个起点在路上的哪个位置,现在将道路分成N-1个等距的部分,你可以把这条路当做是一个数轴,道路上的结点标记为1-N,起点只可能这N个点中的一个。
但是小名还提供了一个重要信息,他每隔一段时间就会用手机看一下自己走了多远,记做D,但是他并不记得他是朝着哪个方向走的,唯一可以确定的是,在两次看手机的间隔中他不会改变方向,每次看完手机后他可能继续向前或者是回头走。
那么问题来了,已知他在散步过程中始终在1-N的范围内,那么符合上述条件的起点可能有多少个?
输入:
第一行两个正整数N M,N表示道路长度,M表示看手机的次数。(N,M <= 20000)
接下来M行,每行一个正整数D,表示小名朝着某个方向走了D个单位。(D <= 20000)
输出:
输出仅包含一个整数,表示可能的起点的数量。
样例输入:
10 3
5
2
6
样例输出:
8
题目分析:
只看单程的话,只有大于N/2时才有些出发点不能选,相反则所有的点都可以选,单程找出最大的一个数,可以根据这个数 2*(N-Max数)算出在当前情况下最先出发的话可以有多少个点可以选。
但是,前面的每一趟都会对后面的每一趟产生影响。我使用的递归,每个出发点都试着走一遍看能不能走通的。
不过最后同学没有来得及跑一下调试,我没想到更好的思路,不知道有没有别的方法。代码就不贴了。