2019京東春季校招筆試測試題二
/*題目:
* 根據輸入的要求輸出值:
* 第一行輸入一個整數:m
* 接下來m行輸入m個字符串
* 最後一行輸入一個較長的字符串(長度小於10000),
* 要求:
* 求出最後一個長串的子串,且它的子串是m個字符串中某個或者全部字符串的子串的個數
* 《子串不能有交叉;(如: aabbc 的字串: a b c )因爲.aa:與a有交叉,bbc與b有交叉》
* 結果:輸出滿足條件的字串的個數。
如輸入:
3
aa
b
ac
bbaac
輸入結果:3
*/
我的代碼是這樣的:
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int m=sc.nextInt();
List<String> li=new ArrayList<String>();
for(int i=0;i<m+1;i++) {
li.add(sc.next());
}
//找出前n個串中的最大長度即爲字串的最大長度
int count=0;
for(String str:li) {
if(str.length()>count) {
count=str.length();
}
}
//去找最後一個串的子串, 子串最大長度爲count
List<String> lis=new ArrayList<String>();//存它所以的子串,滿足沒有交叉
//從字串長度爲1開始取
String lastStr=li.get(li.size()-1);
char[] la=lastStr.toCharArray();
for(int i=1;i<=count;i++) {
//取串
for(int j=0;j<lastStr.length()-i+1;j++) {
StringBuilder strB=new StringBuilder();
//子串長度
for(int n=0;n<i;n++) {
strB.append(la[j+n]);
}
j=j+i-1;
lis.add(strB.toString());
}
}
int total=0;
List<String> newLis=new ArrayList<String>();//存子串,二次篩選沒有交叉的找到滿足沒有交叉的子串(所以感覺第一次篩選一次的目的,就是爲了減少點運行時間,這兒也可以一併篩選的)
newLis.add(lis.get(0));
s:for(int j=1;j<lis.size();j++) {
for(int i=0;i<newLis.size();i++) {
if(lis.get(j).toCharArray()[0]==newLis.get(i).toCharArray()[newLis.get(i).toCharArray().length-1]) {
continue s;
}
}
newLis.add(lis.get(j));
}
//去遍歷,看看滿足是前m個串的子串這個條件不
s:for(String s:newLis) {
for(int i=0;i<li.size()-1;i++) {
if(li.get(i).contains(s) && li.get(i).length()>=s.length()) {
total++;
continue s;
}
}
}
System.out.println(total);
}
}
}
------
在本地IDE上寫完後自己感覺應該沒問題,提交代碼的時候,老是不對。最後檢查出來,
我代碼體中當時爲了查看數據,中間寫了一個測試打印,結果調試編譯不對。 發現的時候,時間到了,已經沒時間改了。
慘痛的教訓,望以後面試的一定要注意呀。