- 821 字符的最短距离 简单
- 258 简单
- 1413 简单
- 39 简单
摩尔投票法- 1800. 最大升序子数组和">1800. 最大升序子数组和
- 575. 分糖果">575. 分糖果
- LCP 02. 分式化简">LCP 02. 分式化简
- 965. 单值二叉树">965. 单值二叉树
- 1619. 删除某些元素后的数组均值">1619. 删除某些元素后的数组均值
- 509. 斐波那契数">509. 斐波那契数
- 496. 下一个更大元素 I">496. 下一个更大元素 I
- 122. 买卖股票的最佳时机 II">122. 买卖股票的最佳时机 II
- 1332. 删除回文子序列">1332. 删除回文子序列
- 剑指 Offer 03. 数组中重复的数字">剑指 Offer 03. 数组中重复的数字
- 257. 二叉树的所有路径">257. 二叉树的所有路径
- 1582. 二进制矩阵中的特殊位置">1582. 二进制矩阵中的特殊位置
- 1640. 能否连接形成数组">1640. 能否连接形成数组
- 1790. 仅执行一次字符串交换能否使两个字符串相等">1790. 仅执行一次字符串交换能否使两个字符串相等
821 字符的最短距离 简单
/*** @param {string} s* @param {character} c* @return {number[]}*/var shortestToChar = function(s, c) {let res = new Array(s.length), p = -1for(let i = 0; i < s.length; i++) {if (c === s[i]) {p = i}if (p !== -1) {res[i] = Math.abs(i - p)}}p = -1for(let i = s.length - 1; i >= 0; i--) {if (c === s[i]) {p = i}if (p != -1) {if (res[i]) {res[i] = Math.min(res[i], Math.abs(i - p))} else {res[i] = Math.abs(i - p)}}}return res};
258 简单
/*** @param {number} num* @return {number}*/var addDigits = function(num) {let res = num, str = num + ''while(res > 9) {res = 0for(let i = 0; i < str.length; i++) {res += Number(str[i])}str = res + ''}return res};
/*** @param {number} num* @return {number}*/var addDigits = function(num) {if (num === 0) {return 0}return num % 9 === 0 ? 9 : num % 9};
1413 简单
/*** @param {number[]} nums* @return {number}*/var minStartValue = function(nums) {let min = 0nums.reduce((prev, cur) => {if (prev + cur < 1) {min = min < prev + cur ? min : prev + cur}return prev + cur}, 0)return Math.abs(min) + 1};
39 简单
摩尔投票法
/*** @param {number[]} nums* @return {number}*/var majorityElement = function(nums) {let res = 0, count = 0for(let i = 0; i < nums.length; i++) {if (count === 0) {res = nums[i]count++} else {res === nums[i] ? count++ : count--}}return res};
面试题02.01 简单
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @return {ListNode}*/var removeDuplicateNodes = function(head) {let start = headwhile(start) {let prev = start, cur = start.nextwhile(cur) {if (cur.val === start.val) {prev.next = cur.next} else {prev = cur}cur = cur.next}start = start.next}return head};
1800. 最大升序子数组和
/*** @param {number[]} nums* @return {number}*/var maxAscendingSum = function(nums) {let max = nums[0], temp = nums[0]for(let i = 1; i < nums.length; i++) {if (nums[i] > nums[i - 1]) {temp += nums[i]} else {max = max < temp ? temp : maxtemp = nums[i]}}return max < temp ? temp : max};
575. 分糖果
/*** @param {number[]} candyType* @return {number}* 第一种情况,每个糖果都不相同,[1,2,3,4],妹妹可以分得2种* 第二种情况,每2个糖果相同,[1,1,2,2],妹妹可以分得2种* 第三种情况,每个糖果都相同,[1,1,1,1],妹妹可以分得1种* 所以妹妹可以分得最多种类是,糖果种类 和 糖果个数/2 中的最小值*/var distributeCandies = function(candyType) {let type = new Set(candyType).sizereturn Math.min(type, candyType.length / 2)};
LCP 02. 分式化简
/*** @param {number[]} cont* @return {number[]}* 1/(a + 1/b) = b / (a * b + 1)*/var fraction = function(cont) {let len = cont.length, res = [1, cont[len - 1]]for(let i = len - 2; i >= 0; i--) {res = [res[1], cont[i] * res[1] + res[0]]}return res.reverse()};
965. 单值二叉树
/*** Definition for a binary tree node.* function TreeNode(val) {* this.val = val;* this.left = this.right = null;* }*//*** @param {TreeNode} root* @return {boolean}*/var isUnivalTree = function(root) {if (!root) {return true}if (root.left && root.val !== root.left.val) {return false}if (root.right && root.val !== root.right.val) {return false}return isUnivalTree(root.left) && isUnivalTree(root.right)};
1619. 删除某些元素后的数组均值
/*** @param {number[]} arr* @return {number}*/var trimMean = function(arr) {let count = arr.length * 0.05, sumarr.sort((a, b) => a -b)arr.splice(0, count)arr.splice(arr.length - count, count)sum = arr.reduce((prev, cur) => {return prev + cur}, 0)return sum / arr.length};
509. 斐波那契数
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
if (n < 2) {
return n
}
return fib(n - 1) + fib(n - 2)
};
496. 下一个更大元素 I
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var nextGreaterElement = function(nums1, nums2) {
for(let i = 0; i < nums1.length; i++) {
let num = nums1[i], idx = nums2.indexOf(num), flag = false
for(let j = idx; j < nums2.length - 1; j++) {
if (nums2[j + 1] > num) {
nums1[i] = nums2[j + 1]
flag = true
break
}
}
if (!flag) {
nums1[i] = -1
}
}
return nums1
};
122. 买卖股票的最佳时机 II
/**
* @param {number[]} prices
* @return {number}
* 只要今天比昨天的价格高就卖出
*/
var maxProfit = function(prices) {
let res = 0
for(let i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
res += prices[i] - prices[i - 1]
}
}
return res
};
1332. 删除回文子序列
/**
* @param {string} s
* @return {number}
* 字符串为空返回0,字符串是回文串返回1,否则返回2
*/
var removePalindromeSub = function(s) {
if (!s.length) {
return 0
}
let flag = true, mid = (s.length >>> 1) + s.length % 2
for(let i = 0; i < mid; i++) {
if (s[i] !== s[s.length - i - 1]) {
flag = false
break
}
}
return flag ? 1 : 2
};
剑指 Offer 03. 数组中重复的数字
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
for(let i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
return i
}
if (nums[nums[i]] < 0) {
return nums[i]
}
// 将nums数组中下标为nums[i]的标为负数,如果再遇到负数就说明出现过
nums[nums[i]] = - nums[nums[i]]
}
// -0 < 0 是 false
return 0
};
257. 二叉树的所有路径
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {string[]}
*/
var binaryTreePaths = function(root) {
let res = []
const getPath = (root, path) => {
if (root) {
path += root.val
if (!root.left && !root.right) {
res.push(path)
} else {
path += '->'
getPath(root.left, path)
getPath(root.right, path)
}
}
}
getPath(root, '')
return res
};
1582. 二进制矩阵中的特殊位置
/**
* @param {number[][]} mat
* @return {number}
*/
var numSpecial = function(mat) {
let res = 0, row = mat.length
for(let i = 0; i < row; i++) {
// 如果第i行元素和为1
if (mat[i].reduce((prev, cur) => prev + cur) === 1) {
// 找出哪一列为1
const idx = mat[i].indexOf(1)
let sum = 0
// 判断idx列的和是否为1
mat.map(item => {
sum += item[idx]
})
if (sum === 1) {
res++
}
}
}
return res
};
1640. 能否连接形成数组
/**
* @param {number[]} arr
* @param {number[][]} pieces
* @return {boolean}
*/
var canFormArray = function(arr, pieces) {
for(let i = 0; i < pieces.length; i++) {
let temp = pieces[i]
// 如果是多个元素,要判断这些元素在arr中是否相连
if (temp.length > 1) {
let idx = arr.indexOf(temp[0])
if (idx === -1) {
return false
}
for(let j = 1; j < temp.length; j++) {
if (arr[idx + j] !== temp[j]) {
return false
}
}
} else {
// 如果只有一个,需要判断这个元素在arr中是否存在
if (!arr.includes(temp[0])) {
return false
}
}
}
return true
};
1790. 仅执行一次字符串交换能否使两个字符串相等
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var areAlmostEqual = function(s1, s2) {
if (s1.length !== s2.length) {
return false
}
let x1, y1, x2, y2, num = 0
for(let i = 0; i < s1.length; i++) {
if(s1[i] !== s2[i]) {
num++
// 如果超出2对不相等就返回false
if (num > 2) {
return false
}
// 记录一下不相等的位置的字符
if (num === 1) {
x1 = s1[i]
x2 = s2[i]
} else {
y1 = s1[i]
y2 = s2[i]
}
}
}
// 判断交换之后能否相等
return x1 === y2 && x2 === y1 ? true : false
};
