LeetCode 389. 找不同

在這里插入圖片描述

1,位運(yùn)算解決

這題說(shuō)的是字符串t只比s多了一個(gè)字符,其他字符他們的數(shù)量都是一樣的。如果我們把字符串s和t合并就會(huì)發(fā)現(xiàn),除了那個(gè)多出的字符出現(xiàn)奇數(shù)次,其他的所有字符都是出現(xiàn)偶數(shù)次,看到這里我們很容易想到《494,位運(yùn)算解只出現(xiàn)一次的數(shù)字》。所以只要是第494題的解我們都可以拿來(lái)用。

所以這題最簡(jiǎn)單的一種解決方式就是使用異或運(yùn)算,關(guān)于異或運(yùn)算有下面幾個(gè)規(guī)律

  • a^a=0; 任何數(shù)字和自己異或都是0

  • a^0=a; 任何數(shù)字和0異或還是他自己

  • a^b^c=a^c^b 異或運(yùn)算具有交換律

因?yàn)閟和t合并之后,偶數(shù)個(gè)的字符通過(guò)異或都會(huì)變?yōu)?,奇數(shù)個(gè)的字符異或之后還是他自己,我們只需要把合并的字符全部異或一遍即可,代碼如下

public char findTheDifference(String s, String t) {
    char[] charArr = s.concat(t).toCharArray();
    char res = 0;
    for (char c : charArr) {
        res ^= c;
    }
    return res;
}


2,純數(shù)學(xué)的方式解決

既然字符串s比t少一個(gè)字符,我們先統(tǒng)計(jì)字符串s中每個(gè)字符的數(shù)量,然后減去字符串t中的每個(gè)字符,如果小于0,說(shuō)明字符串s比t少的就是這個(gè)字符,直接返回即可,代碼如下

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


3,使用結(jié)合Set解決

把字符串s和t合并,然后遍歷合并的每個(gè)字符,判斷集合set中是否有這個(gè)字符,如果有就移除,否則就加入到集合set中。最后集合set中只有一個(gè)字符,這個(gè)字符就是我們所求的。

public char findTheDifference(String s, String t) {
    Set<Character> set = new HashSet<>();
    char[] charArr = s.concat(t).toCharArray();
    for (int i = 0; i < charArr.length; i++) {
        if (set.contains(charArr[i]))
            set.remove(charArr[i]);
        else
            set.add(charArr[i]);
    }
    return (char) set.toArray()[0];
}

其實(shí)還可以把contains和add方法合并,如果add失敗,說(shuō)明集合Set中有這個(gè)數(shù)字,然后再把它給移除即可。

public char findTheDifference(String s, String t) {
    Set<Character> set = new HashSet<>();
    char[] charArr = s.concat(t).toCharArray();
    for (int i = 0; i < charArr.length; i++) {
        if (!set.add(charArr[i]))
            set.remove(charArr[i]);
    }
    return (char) set.toArray()[0];
}


4,計(jì)算兩個(gè)字符串的差值

還可以用t中所有字符的和減去s中所有字符的和,最后結(jié)果就是要求的那個(gè)字符

public char findTheDifference(String s, String t) {
    int distance = 0;
    for (int i = 0; i < s.length(); ++i) {
        distance -= s.charAt(i);
        distance += t.charAt(i);
    }
    distance += t.charAt(t.length() - 1);
    return (char) distance;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目來(lái)源:https://leetcode-cn.com/problems/find-the-difference...
    80e038d7cdfb閱讀 256評(píng)論 0 0
  • 【題目描述】給定兩個(gè)字符串 s 和 t,它們只包含小寫字母。字符串 t 由字符串 s 隨機(jī)重排,然后在隨機(jī)位置添加...
    1江春水閱讀 159評(píng)論 0 0
  • 題目大意 給定兩個(gè)字符串 s 和 t,它們只包含小寫字母。字符串 t 由字符串 s 隨機(jī)重排,然后在隨機(jī)位置添加一...
    不要甜的紅燒肉閱讀 219評(píng)論 0 0
  • 題目描述 給定兩個(gè)字符串 s 和 t,它們只包含小寫字母。字符串 t 由字符串 s 隨機(jī)重排,然后在隨機(jī)位置添加一...
    wanjh閱讀 236評(píng)論 0 0
  • 題目 給定兩個(gè)字符串 s 和 t,它們只包含小寫字母。 字符串 t 由字符串 s 隨機(jī)重排,然后在隨機(jī)位置添加一個(gè)...
    LonnieQ閱讀 103評(píng)論 0 1

友情鏈接更多精彩內(nèi)容