力扣(LeetCode)389

Linus脫襪子發表於2019-01-19

題目地址:
https://leetcode-cn.com/probl…
題目描述:
給定兩個字串 s 和 t,它們只包含小寫字母。

字串 t 由字串 s 隨機重排,然後在隨機位置新增一個字母。

請找出在 t 中被新增的字母。

示例:

輸入:
s = “abcd”
t = “abcde”

輸出:
e

解釋:
`e` 是那個被新增的字母。

解答:
這一題可以用兩種解法。
解法一:利用hash表儲存第一個字串的字母的數量,然後遍歷第二個字串的時候
先查詢到字母,然後把數量減一,如果減完之後小於0,說明這個字母就是多出來的字母
這裡的hash表可以用一個陣列來代替,因為這裡不需要解決hash衝突!!!

java ac程式碼:

class Solution {
    public char findTheDifference(String s, String t) {
        
        int[] hash = new int[`z`+1];
        for(int i = 0;i < s.length();i++)
            hash[s.charAt(i)]++;
        for(int i = 0;i < t.length();i++)
            if( --hash[t.charAt(i)] < 0)
                return t.charAt(i);
        return ` `;
        
    }
}

解法二:把這題看作是一個陣列裡除了一個數出現了一次,其他都出現了偶數次,然後找出這個數,可以
利用異或,因為偶數個自己異或自己為0,而0異或一個數就等於那個數本身,比如說,有偶數個a,現在這
偶數個a異或結果為0,a^a^a^a…^a=0,而0^b=b。
java ac程式碼

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


相關文章