LeetCode演算法題-Find the Difference(Java實現-五種解法)
這是悅樂書的第214次更新,第227篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第82題(順位題號是389)。給定兩個字串s和t,它們只包含小寫字母。字串t由隨機混洗字串s生成,然後在隨機位置再新增一個字母。找到t中新增的字母。例如:
輸入:s =“abcd”, t =“abcde”
輸出:'e'
說明:'e'是新增的字母。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
因為限定字串都是小寫字母,可以藉助一個26長度的陣列,將t中的字元出現次數記錄下來,然後再去遍歷s的字元,只要有對應的就做減法,最後再去找陣列中為1的元素的索引,將其和字元a相加,就是t中新增的字母。
此解法的時間複雜度是O(n),空間複雜度是O(1)。
public char findTheDifference(String s, String t) { int[] arr = new int[26]; for (int i=0; i<t.length(); i++) { arr[t.charAt(i)-'a']++; } for (int j=0; j<s.length(); j++) { arr[s.charAt(j)-'a']--; } for (int k=0; k<arr.length; k++) { if (arr[k] == 1) { return (char)(k+'a'); } } return '0'; }
03 第二種解法
還是使用長度26的陣列,將s中出現的字元及次數記錄下來,再去遍歷t的字元,同時對其對應陣列中的元素做自減,如果自減後小於0,即表示當前字元沒有在s中出現過,此字元就是t中新增的字母。
此解法的時間複雜度是O(n),空間複雜度是O(1)。
public char findTheDifference2(String s, String t) { int[] arr = new int[26]; for (int i=0; i<s.length(); i++) { arr[s.charAt(i)-'a']++; } for (int j=0; j<t.length(); j++) { if (--arr[t.charAt(j)-'a'] < 0) { return t.charAt(j); } } return '0'; }
04 第三種解法
使用異或位運算,其規則是兩邊的對應位不同時,取1,否則取0。兩個相同的數做異或運算時,運算結果是0。0和一個非0的數做異或運算時,運算結果是那個非0的數。將s和t中的所有字元做異或運算,最後的運算結果就是多出來的那個字元。
此解法的時間複雜度是O(n),空間複雜度是O(1)。
public char findTheDifference3(String s, String t) {
int ch = 0;
for (int i=0; i<s.length(); i++) {
ch = ch^s.charAt(i);
}
for (int j=0; j<t.length(); j++) {
ch = ch^t.charAt(j);
}
return (char)ch;
}
05 第四種解法
此解法思路和第三種解法一樣,只是將兩次迴圈合併到一次迴圈中去了。
此解法的時間複雜度是O(n),空間複雜度是O(1)。
public char findTheDifference4(String s, String t) {
int ch = t.charAt(t.length()-1);
for (int i=0; i<s.length(); i++) {
ch = ch^t.charAt(i)^s.charAt(i);
}
return (char)ch;
}
06 第五種解法
既然可以做異或運算,那麼也可以嘗試做加減運算,用t中所有字元的和減去s中所有字元的和,剩下的差就是t中多出的字母。
此解法的時間複雜度是O(n),空間複雜度是O(1)。
public char findTheDifference5(String s, String t) {
char ch = t.charAt(t.length()-1);
for (int i=0; i<s.length(); i++) {
ch -= s.charAt(i);
ch += t.charAt(i);
}
return ch;
}
07 小結
演算法專題目前已連續日更超過兩個月,演算法題文章82+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!