算法編程題

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上寫完後自己感覺應該沒問題,提交代碼的時候,老是不對。最後檢查出來, 

 我代碼體中當時爲了查看數據,中間寫了一個測試打印,結果調試編譯不對。   發現的時候,時間到了,已經沒時間改了。

 

慘痛的教訓,望以後面試的一定要注意呀。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章