找不同
位运算
-
解题思路:
- 异或运算有以下三个性质:
- 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0 = a;
- 任何数和其自身做异或运算,结果是 0,即 a⊕a = 0;
- 异或运算满足交换律和结合律,即 a⊕b⊕a = b⊕a⊕a = b⊕(a⊕a) = b⊕0 = b;
- 例如 nums = [1,1,2,3,3],即1⊕1⊕2⊕3⊕3 = (1⊕1)⊕2⊕(3⊕3)= 0 ⊕ 2 ⊕ 0 = 2;
- 异或运算有以下三个性质:
-
复杂度:
- 时间复杂度:O(N);
- 空间复杂度:O(1);
-
代码实现:
var findTheDifference = function (s, t) { let ret = 0; for (const ch of s) { ret ^= ch.charCodeAt(); } for (const ch of t) { ret ^= ch.charCodeAt(); } // 自身和自身异或返回 0,自身和0异或返回自身,最后返回单数的字符 return String.fromCharCode(ret); };
求和
-
解题思路:
- 将字符串 s 中每个字符的 ASCII 码的值求和,得到 As;
- 对字符串 t 同样的方法得到 At;
- 两者的差值 At - As 即代表了被添加的字符;
-
复杂度:
- 时间复杂度:O(N);
- 空间复杂度:O(1);
-
代码实现:
var findTheDifference = function (s, t) { let as = 0, at = 0; for (let i = 0; i < s.length; i++) { // 返回字符的 Unicode 编码 as += s[i].charCodeAt(); } for (let i = 0; i < t.length; i++) { // 返回字符的 Unicode 编码 at += t[i].charCodeAt(); } // 将 Unicode 编码转为一个字符 return String.fromCharCode(at - as); };
打赏作者
您的打赏是我前进的动力
微信
支付宝
leetcode🧑💻 18. 四数之和
上一篇
评论