389.找不同

389.找不同

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

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

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

示例 1:

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

示例 2:

输入:s = "", t = "y"
输出:"y"

提示:

  • 0 <= s.length <= 1000
  • t.length == s.length + 1
  • st 只包含小写字母

题解:

**方法一:**求和做差

ASCII码之和多出来的就是那个字母

代码实现 1:

class Solution {
    public char findTheDifference(String s, String t) {
        //求字符串的长度
        int sLen = s.length();
        int tLen = t.length();
        //将t比s多出来的字符先赋值给sum
        int sum = t.charAt(tLen - 1);
        //s的长度小,以s的长度进行for循环
        for (int i = 0; i < sLen; i++) {
            //累加
            sum += t.charAt(i);
            //累减
            sum -= s.charAt(i);
        }
        //将差值强转为char,并返回
        return (char) sum;
    }
}

代码实现 2:

class Solution {
    public char findTheDifference(String s, String t) {
        //将s,t转换为字符数组
        char[] chs = s.toCharArray();
        char[] cht = t.toCharArray();
        //创建和变量sum1
        int sum1 = 0;
        //以小的一方为循环条件循环
        for (int i = 0; i < chs.length; i++) {
            //对应字母相减并累加,避免存储溢出
            sum1 += (cht[i] - chs[i]);
        }
        //返回char类型的sum与cht的最后一个字符的和
        return (char)(sum1+cht[chs.length]);
    }
}

**方法二:**计数

这种题目第一想法就是对字母计数,找出计数不同的那个字母就是答案。代码实现的时候,可以对 s 进行字母计数,遍历 t 的时候,如果计数小于 0,那么表示这个字母在 t 中出现得更能多一些,返回这个字母就行了。

代码实现:

class Solution {
    public char findTheDifference(String s, String t) {
        //开辟26个字母的存储数组
        int[] counter = new int[26];
        //遍历字符数组s
        for (char c: s.toCharArray()) {
            //c-'a'为当前字母的下标,用自增计数
            counter[c - 'a']++;
        }
        //遍历字符数组t
        for (char c: t.toCharArray()) {
            //字母下标位置自减,为负则该位置的字母多一个
            if (--counter[c - 'a'] < 0) {
                //该字母即为结果
                return c;
            }
        }
        return 0;
    }
}

作者:Sweetiee 
链接:https://leetcode.cn/problems/find-the-difference/solutions/525835/yi-ju-hua-zhao-bu-tong-reduce-gao-qi-lai-eqok/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

**方法三:**异或

什么?这题也可以异或?辣是当然的~ 因为 t 只比 s 多了一个字母,相当于 只有 1 个字母出现了奇数次,其它字母全部出现了偶数次。

啊!好熟悉呀!这不是那个「只有 1 个数字出现了奇数次,其它数字全部出现偶数次,找出出现奇数次的数字」的经典问题嘛,全部异或即可解决!对于字母也是一样的!

代码实现:

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

作者:Sweetiee 
链接:https://leetcode.cn/problems/find-the-difference/solutions/525835/yi-ju-hua-zhao-bu-tong-reduce-gao-qi-lai-eqok/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

例题: 史上最通俗易懂的异或运算详解【含例题及应用】

最最常出现的面试题:一个整型数组里除了N这个数字之外,其他的数字都出现了两次,找出这N个数字;

比如,从{1, 2, 3, 4, 5, 3, 2, 4, 5}中找出单个的数字: 1

让我们从最简单的,找一个数字开始;

题目:(LeetCode 中通过率最高的一道题) Single Number: Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 

思路: 拿到这个题目,本能的你会使用排序(数字文字我们常常需要排序),排序后可以来判断是否数字成对出现,思路很明显,但是排序的算法上限是 O(nlogn),不符合题目要求;

学习了强大的异或,我们可以轻松的使用它的特性来完成这道题目:
(1)A ^ A = 0;
(2)异或满足交换律、结合律; 所有假设有数组:A B C B C D A使用异或:

 A ^ B ^ C ^ B ^ C ^ D ^ A
= A ^ A ^ B ^ B ^ C ^ C ^ D
= 0 ^ 0 ^ 0 ^ D
= 0 ^ D
= D

是不是很神奇?时间复杂度为O(n),当然是线性的,空间复杂度O(1);
代码:

class Solution {
public int singleNumber(int A[], int n) {
		//特殊情况1,2
		if(n<=0) return -1;
		if(n==1) return A[0];
		int result = 0;
		for (int i = 0; i < n; i ++) {
			result = result ^ A[i];
		}
		return result;
	}
};

版权声明:本文为CSDN博主「来老铁干了这碗代码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43899069/article/details/121048025

一行炫技

利用 Java 的 stream 操作,详解如下:

先字符串拼接起来
String 通过 chars 算子转为 IntStream
利用 reduce,异或所有的值。最后转为 char 类型。

代码实现:reduce详解

class Solution {
    public char findTheDifference(String s, String t) {
        return (char)(s + t).chars().reduce(0, (a, b) -> a ^ b);
    }
}

作者:Sweetiee 
链接:https://leetcode.cn/problems/find-the-difference/solutions/525835/yi-ju-hua-zhao-bu-tong-reduce-gao-qi-lai-eqok/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(每日一题,开发语言)