LeetCode 389. 找不同

在这里插入图片描述

想看更多算法题,可以扫描上方二维码关注我微信公众号“数据结构和算法”,截止到目前我已经在公众号中更新了500多道算法题,其中部分已经整理成了pdf文档,截止到目前总共有1000多页(并且还会不断的增加),可以在公众号中回复关键字“pdf”即可下载。


在这里插入图片描述


1,位运算解决

这题说的是字符串t只比s多了一个字符,其他字符他们的数量都是一样的。如果我们把字符串s和t合并就会发现,除了那个多出的字符出现奇数次,其他的所有字符都是出现偶数次,看到这里我们很容易想到《494,位运算解只出现一次的数字》。所以只要是第494题的解我们都可以拿来用。


所以这题最简单的一种解决方式就是使用异或运算,关于异或运算有下面几个规律


  • a^a=0; 任何数字和自己异或都是0

  • a^0=a; 任何数字和0异或还是他自己

  • a^b^c=a^c^b 异或运算具有交换律


因为s和t合并之后,偶数个的字符通过异或都会变为0,奇数个的字符异或之后还是他自己,我们只需要把合并的字符全部异或一遍即可,代码如下

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,纯数学的方式解决

既然字符串s比t少一个字符,我们先统计字符串s中每个字符的数量,然后减去字符串t中的每个字符,如果小于0,说明字符串s比t少的就是这个字符,直接返回即可,代码如下

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,使用结合Set解决

把字符串s和t合并,然后遍历合并的每个字符,判断集合set中是否有这个字符,如果有就移除,否则就加入到集合set中。最后集合set中只有一个字符,这个字符就是我们所求的。

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];
}

其实还可以把contains和add方法合并,如果add失败,说明集合Set中有这个数字,然后再把它给移除即可。

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,计算两个字符串的差值

还可以用t中所有字符的和减去s中所有字符的和,最后结果就是要求的那个字符

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;
}

5,总结

这题不算难,但解法比较多,位运算应该是最简单的解决方式。

原文链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值