1. 程式人生 > >LeetCode演算法題-Find the Difference(Java實現-五種解法)

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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!