(一) 这道题有点巧妙了
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 次时即返回 false
-
遍历数组,判断当前遍历元素是否小于前一个元素
-
小于前一个元素时,还需要判断是否小于前二个元素
-
如果小于前一个且小于前二个元素时,那么只能将当前元素改变为前一个元素的值,改变次数的变量加 1
-
如果当前遍历元素仅小于前一个元素且大于等于前二个元素时,那么改变前一个元素的值为当前元素的值
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
};