天天一道LeetCode--389. Find the Difference

Given two strings s and t which consist of only lowercase letters.java

String t is generated by random shuffling string s and then add one more letter at a random position.數組

Find the letter that was added in t.dom

 Example:spa

Input:
s = "abcd"
t = "abcde"

Output:
e

Explanation:
'e' is the letter that was added.

從這個題目看出來,本身對字符串的處理能力上真是差勁.net

題目要求

題目叫「找出不一樣點」,題目自己也比較簡單。有兩個字符串s和t,它們只包含小寫的字母。字符串t是由字符串s產生的,只比s多一個字母。題目的目的就是要找出這個多出的字母。code

解法

解法一:這種解法比較直接,創建以個map對應字符串s,key爲字符,value就是該字符出現的次數。首先遍歷字符串s,來創建這個map,而後再遍歷字符串t。對t中出現的每一個字符,都從map中減一,當value值小於0時,則說明該字符就是多出的字符。代碼我就不列出來了,這種解法和第二種相似,你們看了第二種解法就明白了。blog

解法二:第一種解法的map有點過重了,並且涉及到Character和char,int和Integer之間的轉換,我也不喜歡。因此,我就用了另外一種很相似的方法——int數組來代替map。由於字符串只有小寫字母,也就是隻有26中可能,那麼創建一個int[16]的數組便可,索引就是字符char-'a',而數組值就是字符出如今字符串s中的次數。說白了,和解法二思路一致。代碼以下:索引

public char findTheDifference(String s, String t) {
    int[] nums = new int[26];
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        ++nums[ch - 'a'];
    }
    char ret = 'a';
    for (int i = 0; i < t.length(); i++) {
        char ch = t.charAt(i);
        --nums[ch - 'a'];
        if (nums[ch - 'a'] < 0) {
            ret = ch;
            break;
        }
    }
    return ret;
}

解法三:因爲字符串t只比字符串s多了一個字符,那麼直接用t中全部字符值的和減去字符串s中字符值的和便可。字符串

public char findTheDifference(String s, String t) {
    int ret = 0;
    for (int i = 0; i < s.length(); i++) {
        ret -= (int)s.charAt(i);
    }
    for (int i = 0; i < t.length(); i++) {
        ret += (int)t.charAt(i);
    }
    return (char)ret;
}

解法四:另一種思路,既然字符串t只比字符串s多了一個字符,也就是說大部分字符都是相同的。那麼,咱們可使用異或的方式,來找出這個不一樣的值。get

public char findTheDifference(String s, String t) {
    int ret = 0;
    for (int i = 0; i < s.length(); i++) {
        ret ^= s.charAt(i);
    }
    for (int i = 0; i < t.length(); i++) {
        ret ^= t.charAt(i);
    }
    return (char)ret;
}

以上內容均參考自:LeetCode】389 Find the Difference(java)

相關文章
相關標籤/搜索