找不同 | LeetCode刷题笔记

2,585 阅读2分钟

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战


相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


找不同

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

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

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

从简单题目开始刷,锻炼自己的思维能力,为面试准备~

二、思路分析


  • 看看题目的示例,我们来理一理这个思路~

  • 示例 1:

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

    输入:s = "", t = "y"
    输出:"y"
    
  • 示例3:

    输入:s = "a", t = "aa"
    输出:"a"
    
  • 示例4:

    输入:s = "ae", t = "aea"
    输出:"a"
    
  • 提示:

    0 <= s.length <= 1000
    t.length == s.length + 1
    s 和 t 只包含小写字母
    
  • 又是找不同,,现在看到这种题目第一反应就是使用hash来实现。但是!我不用!

  • 默默的想起来另一种笨比方法。

  • 既然第二个字符只比第一个字符多一个。

  • 那么我将第一个的所有字符在第二个字符中替换掉,那么剩下的那个不就是多出来的那个了嘛!

  • 哈哈哈,机制如我。

三、AC 代码


  • 替换破解:

    class Solution {
        public char findTheDifference(String s, String t) {
            //将其转成字符数组,方便遍历
            String[] strArr = s.split("");
            for (int i=0;i<strArr.length;i++){
                //因为有可能第二个增加的字符串会重复,所以这里使用replaceFirst只替换第一个字符
                t = t.replaceFirst(strArr[i],"");
            }
            return t.toCharArray()[0];
        }
    }
    
    • image-20210831175704755.png
    • 啧啧啧,虽然效率不忍直视,但是操作还是蛮骚的嘛!
  • 位运算破解:

  • 上面的骚操作效率较低,下面就来通过异或来解决本题。

  • 什么?这题还可以用异或?

  • 原来是因为t只比s多了一个字母。

  • 那么我们将两个字符串拼接起来,那么字符出现奇数次的肯定就是多了的那个字符呀!

    class Solution {
        public char findTheDifference(String s, String t) {
            char res = 0;
            for (char c: s.toCharArray()) {
                res ^= c;
            }
            for (char c: t.toCharArray()) {
                res ^= c;
            }
            return res;
        }
    }
    
    • image-20210831180109154.png
    • 瞬间起飞!

四、总结

  • 解题思路千千万,不管是本办法还好,还是奇思妙想的解法,能解决就是好办法!白猫黑猫能抓老鼠的猫就是好猫!
  • 这里列几个LeetCode的其他大神的解法作为参考!
  • 点击跳转:官方解法
  • 点击跳转:画解算法

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah