leetcode 刷题整理

(一) 这道题有点巧妙了

var isIsomorphic = function(s, t) {
    for (var i = 0; i < s.length; i++) {
      if (s.indexOf(s[i]) !== t.indexOf(t[i])) {
        return false
      }
    }
    return true
};

(二)岛屿周长

https://leetcode-cn.com/problems/island-perimeter/

(三)判断是否是大写/小写字母

本来想用charCodeAt 来判断

大写字母:

var isBig = function (letter) {
    return letter >= 'A' && letter <= 'Z'
}

小写字母:

var isSmall = function (letter) {
   return letter >= 'a' && letter <= 'z'
}

(四)BigInt 的使用

BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值。在对大整数执行数学运算时,使用BigInt,整数溢出将不再是问题。

比如特别大的整数相加,会有溢出问题

使用BigInt,会得到正确的相加和

(五)环形问题

顺时针好求,逆时针不好求,求出顺时针之后!!用总路程减去顺时针的路程

(六)非递减数组

思路:

  1. 因可以改变一次数组元素的值,那么定义一个变量用来记录改变元素的次数,大于 1 次时即返回 false

  2. 遍历数组,判断当前遍历元素是否小于前一个元素

  3. 小于前一个元素时,还需要判断是否小于前二个元素

  4. 如果小于前一个且小于前二个元素时,那么只能将当前元素改变为前一个元素的值,改变次数的变量加 1

  5. 如果当前遍历元素仅小于前一个元素且大于等于前二个元素时,那么改变前一个元素的值为当前元素的值

var checkPossibility = function(nums) {
  var count = 0
  for (var i = 1; i < nums.length; i++) {
    if (nums[i] < nums[i - 1]) {
      count++
      if (nums[i - 2] && nums[i] < nums[i - 2]) {
        nums[i] = nums[i - 1]
      } else if (nums[i - 2] && nums[i] >= nums[i - 2]) {
        nums[i-1] = nums[i]
      } else { // 前第二个元素不存在 将前两个元素都改成小的那个
        nums[i - 1] = nums[i]
      }
    }
  }
  return count <= 1
};

(六)所有奇数长度子数组的和

前缀和:前缀和的结果是一个数组,该前缀和数组的第n项 是 原数列的前 n 项的和 

var sumOddLengthSubarrays = function(arr) {
  var prefixSumArr = [] // 先求前缀和数组
  var sum = 0
  for (var i = 0; i < arr.length; i++) {
    sum += arr[i]
    prefixSumArr.push(sum)
  }
  console.log(prefixSumArr) // 前缀和数组
  var result = prefixSumArr[prefixSumArr.length - 1]
  var chunkLength = 3 // 奇数长度从3开始
  while (chunkLength <= arr.length) {
    for (var i = 0; i <= arr.length - chunkLength; i++) {
      result += prefixSumArr[i + chunkLength - 1] - (prefixSumArr[i - 1] || 0)
    }
    chunkLength += 2
  }
  return result
}; 

(七)可被 5 整除的二进制前缀

var prefixesDivBy5 = function(A) {
  var arr = [];
  var middle = 0
  for( var i = 0; i < A.length; i++){
    middle = middle * 2 + A[i]
    arr.push((middle % 5 == 0)? true : false)
    middle = middle % 10
  }
  return arr
};

当前子数组的二进制值就是前一个二进制值*2+自身的值。
但是不能一直这样加下去进行计算比较,因为每次乘2后加上自身的值会使得这个数字呈指数增长,当测试数组长一点时就会值溢出。所以每次计算出自身的值后就将自身的值对5取余再进行比较,如果对5取余后的值等于0,那说明当前子串的二进制值是5的倍数,链表添加true,否则添加false.

(八)生成一个n行m列,每个值都是0的数组

let arr = Array.apply(null, Array(n)).map(t => Array(m).fill(0))

 (九) 托普利茨矩阵

判断每一个元素是否都跟它左上角的元素相同 从第二行第二列开始判断

var isToeplitzMatrix = function(matrix) {
  var row = matrix.length
  var line = matrix[0].length
  for (var i = 1; i < row; i++) { // 行
    for (var j = 1; j < line; j++) { // 列
      if (matrix[i][j] !== matrix[i - 1][j - 1]) {
        return false
      }
    }
  }
  return true
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值