关于leetcode:力扣之找不同

31次阅读

共计 2135 个字符,预计需要花费 6 分钟才能阅读完成。

问题形容

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

字符串 t 由字符串 s 随机重排,而后在随机地位增加一个字母。

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

示例 1:

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

示例 2:

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

力扣原题目地址:https://leetcode.cn/problems/…
 

解法一 转数组比照删除

思路

把长字符串 t 转成数组,同时遍历短字符串 s,能够拿到s 中的每一项,而后把同样项,在 t 数组中删掉(ts 多一项,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 字符串合并后单词呈现的次数(找奇数)

思路

  1. 首先把 ts字符串做一个合并,而后统计各个字母呈现的字数。
  2. 已知 ts原本长得就一样的,只不过 t 多了一个字母。
  3. 假如 ts一样的,那么两个字符串合并当前统计下来,每个字母呈现的次数都是 偶数
  4. 当初 t 多了一个字母,所以便会呈现某个字母呈现的次数是 奇数
  5. 次数为奇数的那个字母,就是 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 平时用的不多,所以有时候可能想不起来,然而在这里却是可能发挥作用

思路

  1. 由上述可知,一个字母代表一个数值,ts 本来是相等的,只不过 t 多了一个字符串字母,所以。
  2. 能够把 t 中的字符串都转成数字,并累加一块;同理把 s 中字符串都转成数字,也累加一块
  3. 因为 ts多了一个字母,所以累加的时候多了一个数。所以二者的累加和相减就是多的那个字母所对应的数字
  4. 而后再通过 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)
};

正文完
 0