389. Find the Difference

389. 找不同

给定两个字符串 st,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

 

示例:

输入: s = "abcd"    t = "abcde"
输出: e
解释: 'e' 是那个被添加的字母。 

解法一

//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:
    char findTheDifference(string s, string t) {
        unordered_map<char, int> um;
        for(char c : s) ++um[c];
        for(char c : t) {
            --um[c];
            if(um[c] < 0) return c;
        }
        return '\0';
    }
};

解法二

//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
    char findTheDifference(string s, string t) {
        int sum1 = 0, sum2 = t[t.size() - 1];//int sum = t[t.size() - 1];
        for(int i = 0; i < s.size(); i++) {
            sum1 += s[i];//sum += t[i];
            sum2 += t[i];//sum -= s[i];
        }
        return sum2 - sum1;//return sum;
    }
};

解法三

//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
    char findTheDifference(string s, string t) {
        int diff = t[t.size() - 1];
        for(int i = 0; i < s.size(); i++) {
            diff ^= s[i];
            diff ^= t[i];
        }
        return diff;
    }
};

解法一依然是利用哈希表,遍历一次计数,再遍历一次找不同。 解法二比较巧妙,把字符当做整型处理,分别求两个数组的和,用数组2的和减数组1的和,得到的差转为字符,就是答案。优点是省去了额3外的线性空间需求,并且可以一次同时遍历两个数组。缺点是数字如果太大,可能和会溢出。 解法三更巧妙,仍然利用了异或运算的性质,优点是不会溢出。

2019/05/01 17:59
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值