LeetCode 389. 找不同
题目介绍:
给定两个字符串s
和t
,它们只包含小写字母。
字符串 t
由字符串 s
随机重排,然后在随机位置添加一个字母。
请找出在 t
中被添加的字母。
示例:
输入: s = "abcdef", t = "abcdefg" 输出: "g" 解释: 'g' 是那个被添加的字母。
题目分析
很多小伙伴在看到这道题的时候,内心都是一喜,这也太简单了,难道是最近扶老奶奶过马路太多了,老天爷眷顾了。
上来一顿遍历字符串t
,判断某个字符不在s
中,说明这个就是随机添加的字母。
啪啪啪,一顿键盘操作,写完收工~
提交后,结果却啪啪打脸~
按照这个思路,不存在s
中的字符肯定是新增加的,但是新增加的字符是有可能在s
中存在的!
方案:考虑字符的ASCII码值
我们都知道每一个字符都有对应的ASCII码值,字符串s
和t
只是新增加了一个字符,倘若我们把所有的字符ASCII码累加到一起,s
和t
的ASCII码值和相减,多出的ASCII码值就是对应了一个新增的字符。
Up Code ~ 上码 ~
/** * @method findTheDifference * @description: 通过ASCII码找不同 * @param {string} s * @param {string} t * @return {string} */ function findTheDifference(s: string, t: string): string { // 获取s字符串长度 const sLen = s.length; // 特殊情况处理,s长度为0,直接返回t即可 if (sLen === 0) { return t; } // 接收字符串s的ASCII码值 let sAscii = 0; // 接收字符串t的ASCII码值 let tAscii = 0; // 遍历s的每一个字符 for (let i = 0; i < sLen; i++) { // 将每一个ASCII码值进行累加 sAscii += s[i].charCodeAt(0); } // 遍历t的每一个字符 for (let i = 0; i < t.length; i++) { // 将每一个ASCII码值进行累加 tAscii += t[i].charCodeAt(0); } // 二者相减,将ASCII码再转为对应的字符 return String.fromCharCode(tAscii - sAscii); }
功能测试:
let s1 = 'abcdef'; let t1 = 'abcdefg'; console.log(findTheDifference(s1, t1)); // g let s2 = 'abcde'; let t2 = 'abcdea'; console.log(findTheDifference(s2, t2)); // a
嘎嘎好使