京東2018校招研發筆試題記錄
阿新 • • 發佈:2019-01-10
背景
這幾天正好是各大網際網路公司校招筆試的時間,於是陪著同學一起做了一下京東的筆試題。其中單選和不定項選擇題涵蓋的範圍還是比較廣的,包括子網掩碼的計算、linux相關知識點、C++知識點、設計模式等。程式設計題有兩道,其實難度不大,現在將第一題以及我的答案記錄一下供大家參考。
題目描述:
給定一個字串s,請計算輸出含有連續兩個s作為子串的最短字串。注意兩個s可能有重疊部分。例如,”ababa”含有兩個aba。
輸入描述:
輸入包括一個字串s,字串長度length(1<length1<50),s中每個字元都是小寫字母。
輸出描述:
輸出一個字串,即含有連續兩個s作為子串的最短字串。
輸入:
abracadabra
輸出:
abracadabracadabra
思路:
題目中說是包含兩個s作為子串,而且可以有重疊部分。所以說,如果沒有重疊的部分,最後輸出的便是最長的字串,即兩個s拼接在一起。如果有重疊部分,也是僅限於s的前n位和s的後n位是一樣的才可以。因此,我們可以用最簡單的方式,把兩個s當成s1和s2。從s1的第2(n)位往後開始和s2的第一位往後的每一個字元進行對比,如果直到s1的結尾都是一致的,則最後輸出的字元便是s1的前1(n-1)個字元拼接s2。如果有不一致的,則從s1的第3(n+1)位開始重複比對,以此類推。
程式碼實現:
public class JDTest {
public static void main(String[] args) {
Scanner ss = new Scanner(System.in);
String s = ss.next();
System.out.println(getString(s));
}
public static String getString(String s) {
char[] charArray = s.toCharArray();//將字串s轉為char陣列
for (int i = 1; i < charArray.length; i++) {
//每次從s1的第i位與s2的第0位開始比較
int j = 0;
int tempi = i;
//如果相等則繼續比較s1和s2的下一位字元
while (charArray[j] == charArray[tempi]) {
//如果到了s1的最後一位都是相等的,則返回最短字串
if (tempi == charArray.length - 1) {
String result1 = s.substring(0, i);
return result1 + s;
}
j++;
tempi++;
}
}
//如果沒有重複,則返回兩個s拼接的字串
return s + s;
}
}
當然,如果有更好的解決方法,希望各位讀者可以補充交流。
最後慶祝我的獨立域名部落格正式上線啦
本篇文章也會在我的獨立域名部落格異思園同步釋出,當然,在那個部落格上也會發布一些和技術無關的瞎扯胡扯的文章啦,畢竟在CSDN部落格上,還是主要寫一些技術性的文章嘛(嚴肅臉)