leetcode.389.找不同

389.找不同


leetcode地址

1. 题解

/**
     * 给定两个字符串 s 和 t,它们只包含小写字母。
     *
     * 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
     *
     * 请找出在 t 中被添加的字母。
     * 
     * 输入:s = "abcd", t = "abcde"
     * 输出:"e"
     */

    // 利用字符和的差值来识别差异字母
    public static char findTheDiff(String s, String t) {
        long count = 0;
        int i = 0;
        for (i = 0; i < s.length(); i++) {
            count += t.charAt(i) - s.charAt(i);
        }
        count += t.charAt(i);
        return (char) count;
    }

    // 利用相同索引累加计数,再计数--,判断是否小于0
    public static char findTheDiff2(String s, String t) {
        int[] counter = new int[26];
        for (char c : s.toCharArray()) {
            // 利用索引来计数
            counter[c - 'a']++;
        }
        for (char c : t.toCharArray()) {
            if (--counter[c - 'a'] < 0) {
                return c;
            }
        }
        return 0;
    }

    public static char findTheDiff3(String s, String t) {
        // 利用异或的特性:参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。
            // 0 异或任何数 = 任何数
            // 1 异或任何数 = -(任何数取反) (取反:0变1,1变0)
                // 取反:
                    // ~1 = - (1 + 1) = -2
                    // ~20 = - (20 + 1) = -21
            // 任何数异或自己 = 0

        // a -> 97 b -> 98 c -> 99

        // s = "ab", t = "abc"
        // for1:// res = 97 ^ 98
        // for2: // res = 97 ^ 98 ^97 ^ 98 ^ 99 = 99
        char res = 0;
        // for1
        for (char c : s.toCharArray()) {
            // res = res ^ c
            res ^= c;
        }
        // for2
        for (char c : t.toCharArray()) {
            res ^= c;
        }
        return res;
    }
  1. 异或

    参考链接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值