问题描述
给定两个字符串 s
和 t
,它们只包含小写字母。
字符串 t
由字符串 s
随机重排,然后在随机位置添加一个字母。
请找出在 t
中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y"
输出:"y"
力扣原题目地址:https://leetcode.cn/problems/...
解法一 转数组对比删除
思路
把长字符串t
转成数组,同时遍历短字符串s
,可以拿到s
中的每一项,然后把同样项,在t
数组中删掉(t
比s
多一项,s
中有的t
中一定有)
比如t
为'abc'
,s
为'ab'
,那么不停对比,不停删除,最后t
中只剩一个'c'
,是s
中没有的,即为t
中添加的字母。即找到了,代码如下:
代码
var findTheDifference = function (s, t) {
let stack = t.split('') // 1. 把长字符串t转成数组
for (let j = 0; j < s.length; j++) { // 2. 遍历短字符串s
let ind = stack.indexOf(s[j]) // 3. 拿到这一项在对应数组中的索引位置
stack.splice(ind, 1) // 4. 并做对应删除,就这样不停删除,数组中就会只剩一个了
}
return stack[0] // 5. 剩的这一个就是t中被添加的字母
};
解法二 统计t和s字符串合并后单词出现的次数(找奇数)
思路
- 首先把
t
和s
字符串做一个合并,然后统计各个字母出现的字数。 - 已知
t
和s
本来长得就一样的,只不过t
多了一个字母。 - 假设
t
和s
一样的,那么两个字符串合并以后统计下来,每个字母出现的次数都是偶数
- 现在
t
多了一个字母,所以便会出现某个字母出现的次数是奇数
- 次数为奇数的那个字母,就是t中被添加的字母
代码
var findTheDifference = function (s, t) {
let ss = s + t // 1. 合并字符串
let map = new Map() // 2. 使用集合进行次数统计
for (let i = 0; i < ss.length; i++) {
if (map.has(ss[i])) {
let count = map.get(ss[i])
count = count + 1
map.set(ss[i], count)
} else {
map.set(ss[i], 1)
}
}
// 3. 统计好以后,遍历这个map结合,看看谁出现的次数是奇数
for (const [key, value] of map) {
if (value % 2 == 1) {
return key // 4. 次数为奇数的那个字母,就是t中被添加的字母
}
}
};
解法三 使用String.charCodeAt()方法和String.fromCharCode()方法
知识回顾
String.charCodeAt()
把字符串转换成Unicode数字值(UTF-16 编码单元)
console.log( 'a'.charCodeAt() ) // 97
console.log( 'b'.charCodeAt() ) // 98
console.log( 'c'.charCodeAt() ) // 99
console.log( 'd'.charCodeAt() ) // 100
console.log( 'e'.charCodeAt() ) // 101
既然字符串可以转换成数字类型的Unicode值,那么数字类型也可以转回去(前提是有的情况下)
String.fromCharCode()
把数字值转回对应的字符串
console.log( String.fromCharCode(97) ) // 'a'
console.log( String.fromCharCode(98) ) // 'b'
console.log( String.fromCharCode(99) ) // 'c'
console.log( String.fromCharCode(100) ) // 'd'
console.log( String.fromCharCode(101) ) // 'e'
这两个api平常用的不多,所以有时候可能想不起来,但是在这里却是能够发挥作用
思路
- 由上述可知,一个字母代表一个数值,
t
和s
原本是相等的,只不过t
多了一个字符串字母,所以。 - 可以把
t
中的字符串都转成数字,并累加一块;同理把s
中字符串都转成数字,也累加一块 - 因为
t
比s
多了一个字母,所以累加的时候多了一个数。所以二者的累加和相减就是多的那个字母所对应的数字 - 然后再通过String.fromCharCode()方法把数字转回字符串即可
代码
var findTheDifference = function (s, t) {
// 1. 定义两个变量用于累加
let countT = 0
let countS = 0
for (let i = 0; i < t.length; i++) {
let item = t[i]
countT = countT + item.charCodeAt() // 2. 字母转Unicode数字
}
for (let j = 0; j < s.length; j++) {
let item = s[j]
countS = countS + item.charCodeAt() // 2. 字母转Unicode数字
}
// 3. 二者的差值数,转成字符串字母就是多的那个字母
return String.fromCharCode(countT - countS)
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。