开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
一、题目描述:
给定两个字符串
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 只包含小写字母
二、思路分析:
- 先将两个字符串转为char数组
- 排序
- 遍历下标0到s.length-1的两数组元素,一旦发现有c1[i] != c2[i],这个c2[i]就是返回的结果
- 如果遍历过程中没有发现不等的情况,说明这个新插入的字符一定是c2数组的最后一个字符,返回c2[t.length-1]。
官方解法--求和(很巧妙)
- 遍历s和t两个字符串,将它们的值相加
- tSum - sSum的差值就是新添加的元素,返回差值即可,注意转换成char类型
官方解法二--计数
遍历s时,出现的字符就在相应的下标对应的位置+1,接着遍历t,每遍历一个元素就在相对应的位置让计数-1,直到最后,数组中元素为1的那个就是我们要得到的结果,将下标+'a'就是字符。
三、AC 代码:
class Solution {
//我的解法
public char findTheDifference1(String s, String t) {
if ( s.equals("") || s.length() == 0){
return t.charAt(0);
}
char[] c1 = s.toCharArray();
char[] c2 = t.toCharArray();
Arrays.sort(c1);
Arrays.sort(c2);
for (int i = 0; i < c1.length; i++) {
if (c1[i] != c2[i]){
return c2[i];
}
}
return c2[t.length()-1];
}
//官方解法一:使用计数,最后扫描完t后,最后一个数量为1的就是结果
// 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 ' ';
// }
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);
}
}