389.找不同
给定两个字符串 s
和 t
,它们只包含小写字母。
字符串 t
由字符串 s
随机重排,然后在随机位置添加一个字母。
请找出在 t
中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y"
输出:"y"
提示:
0 <= s.length <= 1000
t.length == s.length + 1
s
和t
只包含小写字母
题解:
**方法一:**求和做差
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。