将两个有序数组合并为一个排好序的大数组
将两个有序数组合并为一个排好序的大数组123456789function mergeAry(left = [], right = []) { const result = []; while (left.length && right.length) { result.push(left[0] <= right[0] ? left.shift() : right.shift()); } return result.concat(left, right);}console.log(mergeAry([1, 2, 3], [1, 4, 8, 9])); // [ 1, 1, 2, 3, 4, 8, 9 ]
Array push
Array push1234567891011// 类数组let obj = { '1': 'a', '2': 'b', length: 2, push: Array.prototype.push};// Array.prototype.push.call(obj, 'c');obj.push('c')console.log(obj); // { '1': 'a', '2': 'c', length: 3 }
十进制转化为其他进制
十进制转化为其他进制123456789101112function binary(num, base = 2) { const stack = [] const digits = '0123456789ABCDEF' while (num > base - 1) { stack.push(digits[num % base]) num = ~~(num / 2) } stack.push(digits[num]) return stack.reverse().join('')}console.log(binary(10)) // '1010'
斐波那契数列
斐波那契数列
斐波那契数列从第三项开始,每一项都等于前两项之和。指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 …
递归
12345function fib(n) { if (n === 1 || n === 2) return n - 1; return fib(n - 1) + fib(n - 2)}console.log(fib(10)); // 34
时间复杂度为 O(2^n) 2. 非递归
123456789101112function fib(n) { let a = 0; let b = 1; let c = a + b; for (let i = 3; i < n; i++) { a = b; b = c; c = a + b; } return c;}console.log(fib(10)); // 34
时间复杂度为 O(n)
阿拉伯数字转中国数字
阿拉伯数字转中国数字
支持转换范围 0~99
输入:num = “10”
输出:’十’
输入:num = “15”
输出:’十五’
12345678910111213141516const transformNum = (num) => { const chars = (num + '').split('') const capitalNum = '零一二三四五六七八九十' if (num <= 10) { return capitalNum[num] || num } let split = '' if (num >= 10 && num < 100 && (num % 10 !== 0)) { split = '十' } const str = chars.map(char => { ...
字符频次唯一的最小删除次数
字符频次唯一的最小删除次数
如果字符串 s 中 不存在 两个不同字符 频次 相同的情况,就称 s 是 优质字符串 。给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最小 字符数。字符串中字符的 频次 是该字符在字符串中的出现次数。例如,在字符串 “aab” 中,’a’ 的频次是 2,而 ‘b’ 的频次是 1 。
输入:s = “aab”
输出:0
解释:s 已经是优质字符串。
输入:s = “aaabbbcc”
输出:2
解释:可以删除两个 ‘b’ , 得到优质字符串 “aaabcc” 。另一种方式是删除一个 ‘b’ 和一个 ‘c’ ,得到优质字符串 “aaabbc” 。
123456789101112131415var minDeletions = function(s) { const cnt = Object.values(_.countBy(s)).sort((a, b) => b - a) let ans = 0 for (let i = 1; i < cnt.length; i ++) { ...
石子游戏 II
石子游戏 II
爱丽丝和鲍勃继续他们的石子游戏。许多堆石子 排成一行,每堆都有正整数颗石子 piles[i]。游戏以谁手中的石子最多来决出胜负。爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,M = 1。在每个玩家的回合中,该玩家可以拿走剩下的 前 X 堆的所有石子,其中 1 <= X <= 2M。然后,令 M = max(M, X)。游戏一直持续到所有石子都被拿走。假设爱丽丝和鲍勃都发挥出最佳水平,返回爱丽丝可以得到的最大数量的石头。
输入:piles = [2,7,9,4,4]
输出:10
解释:如果一开始 Alice 取了一堆,Bob 取了两堆,然后 Alice 再取两堆。爱丽丝可以得到 2 + 4 + 4 = 10 堆。如果 Alice 一开始拿走了两堆,那么 Bob 可以拿走剩下的三堆。在这种情况下,Alice 得到 2 + 7 = 9 堆。返回 10,因为它更大。
输入:piles = [1,2,3,4,5,100]
输出:104
1234567891011121314151617181920var stoneGameII = function(pil ...
两点之间不包含任何点的最宽垂直区域
两点之间不包含任何点的最宽垂直区域
给你 n 个二维平面上的点 points ,其中 points[i] = [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。垂直区域 的定义是固定宽度,而 y 轴上无限延伸的一块区域(也就是高度为无穷大)。 最宽垂直区域 为宽度最大的一个垂直区域。请注意,垂直区域 边上 的点 不在 区域内。
输入:points = [[8,7],[9,9],[7,4],[9,7]]
输出:1
解释:红色区域和蓝色区域都是最优区域。
输入:points = [[3,1],[9,0],[1,0],[1,4],[5,3],[8,8]]
输出:3
1234567891011121314var maxWidthOfVerticalArea = function(points) { // 将points中每个点的x坐标提取出来,存入数组xArr中 let xArr = points.map(point => point[0]); // 对xArr进行升序排序 xArr.sort((a, b) = ...
好数对的数目
好数对的数目
给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。
输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对
1234567891011var numIdenticalPairs = function(nums) { const cnt = new Map<number, number>(); for (const num of nums) { cnt.set(num, (cnt.get(num) ?? 0) + 1); } const ans = Array.from(cnt.values()).reduce( (a, v) => a + Math ...
最大交换
最大交换
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
输入: 2736
输出: 7236
解释: 交换数字 2 和数字 7。
输入: 9973
输出: 9973
解释: 不需要交换。-
12345678910111213141516171819202122232425var maximumSwap = function(num) { var str = num + "" var arr = [] var big = [] for (var i = 0; i < str.length; i++) { arr.push(parseInt(str[i])) big.push(parseInt(str[i])) } big.sort(function (a, b) { return b-a }) for (var i = 0; i < arr.length; i++) { if (big[i] != arr[i]) { for ...