389:找不同

题目描述

给定两个字符串 s 和 t,它们只包含放到小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。

示例 1:
输入:s = “abcd”, t = “abcde”
输出:“e”
解释:‘e’ 是那个被添加的字母。


原题地址

解题思路

  • 思路一
    因为上次刚做完使用双HashTable的题目,这个题目就想用两个map,字符串char当做key,字符出现次数当做value,然后对比形同key的不同value即可。
   HashMap<Character, Integer> scharacterIntegerHashMap = new HashMap<> ();
        HashMap<Character, Integer> tcharacterIntegerHashMap = new HashMap<> ();

        for (int i = 0; i < s.length (); i++) {
            String substring = s.substring (i, i + 1);
            boolean b = scharacterIntegerHashMap.containsKey (substring.charAt (0));
            if (b) {
                Integer integer = scharacterIntegerHashMap.get (substring.charAt (0));
                scharacterIntegerHashMap.put (substring.charAt (0), integer+1);
            }else {
                scharacterIntegerHashMap.put (substring.charAt (0), 1);
            }
        }

        for (int i = 0; i < t.length (); i++) {
            String substring = t.substring (i, i + 1);
            boolean b = tcharacterIntegerHashMap.containsKey (substring.charAt (0));
            if (b) {
                Integer integer = tcharacterIntegerHashMap.get (substring.charAt (0));
                tcharacterIntegerHashMap.put (substring.charAt (0), integer+1);
            }else {
                tcharacterIntegerHashMap.put (substring.charAt (0), 1);
            }
        }

        Iterator<Map.Entry<Character, Integer>> iterator = tcharacterIntegerHashMap.entrySet ().iterator ();
        char diff = 0;
        while (iterator.hasNext ()) {
            Map.Entry<Character, Integer> next = iterator.next ();
            if (scharacterIntegerHashMap.containsKey (next.getKey ())) {
                //判断值是否相等
                if (scharacterIntegerHashMap.get (next.getKey ())!=next.getValue ()){
                    diff = next.getKey ();
                }
            }else {
                diff = next.getKey ();
            }
        }
        return diff;

上面是自己做的,然后愉快的提交,结果打败了5%的用户,我想知道这5%的怎么写的!😅
其实在提交的时候就觉得会很烂,但脑子里也没啥其他思路。


  • 思路二
    官方:首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减1。当发现某个字符计数值为负数时,说明该字符在字符串t 中出现的次数大于在字符串s 中出现的次数,因此该字符为被添加的字符
    public char findTheDifference(String s, String t) {
       int[] cnt = new int[26];
       for (int i = 0; i < s.length(); ++i) {
           char ch = s.charAt(i);
           cnt[ch - 'a']++;
       }
       for (int i = 0; i < t.length(); ++i) {
           char ch = t.charAt(i);
           cnt[ch - 'a']--;
           if (cnt[ch - 'a'] < 0) {
               return ch;
           }
       }
       return ' ';
   }
  • 思路三:char求和
    public char findTheDifference(String s, String t) {
        int as = 0, at = 0;
        for (int i = 0; i < s.length(); ++i) {
            as += s.charAt(i);
        }
        for (int i = 0; i < t.length(); ++i) {
            at += t.charAt(i);
        }
        return (char) (at - as);
    }
  • 思路四:异或位运算
  public char findTheDifference(String s, String t) {
        int ret = 0;
        for (int i = 0; i < s.length(); ++i) {
            ret ^= s.charAt(i);
        }
        for (int i = 0; i < t.length(); ++i) {
            ret ^= t.charAt(i);
        }
        return (char) ret;
    }

最让我看不懂的就是第四中解题方式,自己每一步都按照二进制的值求也想不出个所以然来。

最后看的是官方是视频讲解才懂的,异或运算有下面三个特性:

1.任何数和0做异或运算,结果仍然是原来的数
2.任何数和其自身做异或运算,结果是0
3.异或运算满足交换律和结合律

不需要知道每一次的运算结果,如果出现偶数个char做异或运算就是0了,因为两个一样的数字异或运算结果是0,所以最终的异或结果必定是落单的那一个,真的是秒啊!

Github地址:https://github.com/winslis2/leetcode/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Scratch 是一种图形化编程语言,它的主要目的是帮助儿童和初学者学习编程。在 Scratch 中,你可以创建动画、游戏和交互式应用程序,而不需要编写复杂的代码。当然,Scratch 也可以用来进行一些简单的编程任务,比如找出两个图片的不同之处。 以下是一个简单的 Scratch 项目,可以帮助你找出两个图片的不同之处: 1. 在 Scratch 编辑器中创建一个新项目。 2. 在左侧的“角色”面板中,点击“选择角色”按钮,然后选择“精灵”。 3. 在右侧的“舞台”面板中,点击“背景”按钮,然后选择一个背景。 4. 在左侧的“角色”面板中,点击“选择角色”按钮,然后选择“精灵2”。 5. 在右侧的“舞台”面板中,点击“背景”按钮,然后选择另一个背景。 6. 在“精灵”面板中,为每个精灵添加以下脚本: 精灵1: 当 flag 被点击时 切换到背景 [背景1 v] 等待 1 秒 切换到背景 [背景2 v] 精灵2: 当 flag 被点击时 切换到背景 [背景2 v] 等待 1 秒 切换到背景 [背景1 v] 7. 点击“旗帜”按钮,然后观察两个背景之间的不同之处。 这个项目的基本思路是,两个精灵分别控制两个背景的切换,然后等待一秒钟,再切换回另一个背景。通过反复切换两个背景,你可以找出它们之间的不同之处。 当然,这只是一个简单的例子,你可以使用 Scratch 的其他功能来实现更复杂和有趣的项目,帮助你学习编程并提高你的创造力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值