力扣(LeetCode)389

题目地址:
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;
    }
}


    原文作者:Linus脱袜子
    原文地址: https://segmentfault.com/a/1190000017848577
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞