价格区间指定递增
价格区间指定递增
根据指定的价格范围,递增单位也不同。在 0 到 10 之间,每次递增 1;在 10 到 100 之间,每次递增 5;在 100 到 1000 之间,每次递增 10;在 1000 以上,每次递增 20。最小值为 0,最大值等于指定值(如 500)。
123456789101112131415161718192021222324252627282930313233// 这个函数接受一个最大价格作为参数,并返回从0到最大价格之间的所有可能的价格值。该函数将使用一个// 包含每个范围的对象数组,然后使用while循环来生成递增的价格列表。最终的结果将作为数组返回并输出到控制台。// 版本一function getPriceRangeValues(maxPrice) { if (maxPrice == undefined) return [] const priceRanges = [ { max: 10, increment: 1 }, { max: 100, increment: 5 }, { ...
二分查找
二分查找1234567891011121314151617//循环不变式 guess 等于l r中间位置const bsearch = (A, x) => { let l = 0 let r = A.length - 1 let guess while (l <= r) { console.log('find') guess = Math.floor((l + r) / 2) if (A[guess] === x) return guess if (A[guess] > x) r = guess - 1 else l = guess + 1 } return -1}let arr = [1, 2, 3, 4, 5, 6, 7, 8]console.log(bsearch(arr, 6)) // 5
将两个有序数组合并为一个排好序的大数组
将两个有序数组合并为一个排好序的大数组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) = ...