Leetcode 461.汉明距离

题目:461.汉明距离

初始思路

今天没安排刷题,自己找几个hot 100写写
先转成二进制,前面补0,最后每位比较

代码

  1. var hammingDistance = function (x, y) {
  2. x = x.toString(2)
  3. y = y.toString(2)
  4. let maxLength = Math.max(x.length, y.length)
  5. // 前面补0
  6. x = x.padStart(maxLength, 0)
  7. y = y.padStart(maxLength, 0)
  8. let count = 0
  9. for (let i = 0; i < maxLength; i++) {
  10. if (x[i] !== y[i]) count++
  11. }
  12. return count
  13. };
  1. // 左移运算
  2. const hammingDistance = (x, y) => {
  3. let count = 0, flag = 1
  4. while (flag) {
  5. const xBit = x & flag, yBit = y & flag
  6. if ((xBit || yBit) && xBit !== yBit) count++
  7. flag = flag << 1
  8. }
  9. return count
  10. }
  11. // 异或运算
  12. const hammingDistance = (x, y) => {
  13. let xOry = x^y
  14. let count = 0
  15. while (xOry) {
  16. count++
  17. xOry = (xOry - 1) & xOry
  18. }
  19. return count
  20. }

感想

  1. toString()原来可以转化进制。
  2. 通过左移运算获取每一位的值,进行比较,如果x & flag或y & flag有值,且两者不相等,count加1。
  3. 根据异或运算的规则,x^y的值里面的1代表不同位,有多少个1即有多少个不同位。只要求出异或值中1的个数即可。

Leetcode 3.无重复字符的最长子串

题目:3.无重复字符的最长子串

初始思路

感觉像双指针

代码

  1. var lengthOfLongestSubstring = function (s) {
  2. const len = s.length
  3. if (len <= 1) return len
  4. let left = 0
  5. let right = 1
  6. let max = 0
  7. let temp
  8. while (right < len) {
  9. // 截取这段字符串
  10. temp = str.slice(left, right)
  11. if (temp.indexOf(str.charAt(right)) > -1) {
  12. // 如果right指针所在的字符在字符串中出现过,左指针移动
  13. left++
  14. continue
  15. } else {
  16. // 如果没出现过,右指针继续移动寻找
  17. right++
  18. }
  19. if (max < right - left) {
  20. max = right - left
  21. }
  22. }
  23. return max
  24. };

感想

  1. 使用slice截取字符串,使用charAt寻找字符出现的第一个位置。