组合总和 II
组合总和 II
给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。
输入:candidates = [10,1,2,7,6,1,5], target = 8输出:[[1,1,6],[1,2,5],[1,7],[2,6]]
123456789101112131415161718var trainWays = function(n) { if (n < 2) return 1 let p = 1 let q = 1 let res = 2 for(let i = 2; i<n;i++){ // 每一次多加一步,前面的种类都不会变,因为新加的都是一步走了就行 // 那么只需要考虑最后一步是2步的情况,那么前面n-2的步数种类我也是知道的 // 那么n的种类就是fn(n - 2) + fn(n - ...
2出现的次数
2 出现的次数
编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。
输入: 25输出: 9解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次)
1234567891011121314var numberOf2sInRange = function(n) { if(n < 2) return 0 let high = n / 10 >> 0, cur = n % 10, digit = 1, low = 0 , ans = 0 while(high || cur){ if(cur < 2) ans += high*digit else if(cur == 2) ans += high*digit + low + 1 else ans += high*digit + digit low += cur*digit cur=high%10 high = high/ ...
递归乘法
递归乘法
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
输入:A = 1, B = 10输出:10示例 2:
输入:A = 3, B = 4输出:12
12345678910var multiply = function(A, B) {let min = Math.min(A,B); let max = Math.max(A,B); let count = 0; while (min) { count += max; min--; } return count;};
三步问题
三步问题
三步问题。有个小孩正在上楼梯,楼梯有 n 阶台阶,小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模 1000000007。
输入:n = 3输出:4说明: 有四种走法
输入:n = 5输出:13
12345678var waysToStep = function(n) { const mod = 1000000007; const dp = [null, 1, 2, 4]; for (let i = 4; i <= n; i++) { dp[i] = (dp[i - 1] + dp[i - 2] + dp[i - 3]) % mod; } return dp[n];};
去掉最低工资和最高工资后的工资平均值
去掉最低工资和最高工资后的工资平均值
给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
输入:salary = [4000,3000,1000,2000]输出:2500.00000解释:最低工资和最高工资分别是 1000 和 4000 。去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500
输入:salary = [1000,2000,3000]输出:2000.00000解释:最低工资和最高工资分别是 1000 和 3000 。去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000
123456789var average = function(salary) { let max = 0,min = 100010,sum=0; for(let i = 0 , len = salary.length;i < len;i++){ max = Math.max(max,sala ...
砍竹子 I
砍竹子 I
现需要将一根长为正整数 n 的竹子砍为若干段,每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。
输入: n = 12输出: 81
123456789var cuttingBamboo = function(n) { const dp = new Array(n + 1).fill(1); for(let i = 2; i < n + 1; i++){ for(let j = 1; j < i; j++){ dp[i] = Math.max(Math.max((i - j) * j, j * dp[i - j]), dp[i]); } } return dp[n];};
数组中两元素的最大乘积
数组中两元素的最大乘积
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。请你计算并返回该式的最大值。
输入:nums = [3,4,5,2]输出:12解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)(nums[2]-1) = (4-1)(5-1) = 3*4 = 12 。
输入:nums = [1,5,4,5]输出:16解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。
1234567891011121314var maxProduct = function(nums) { var a = nums[0]; var b = nums[1]; for (var i = 2; i < nums.length; i++) { if (a > b) { nums[i] > b &&a ...
跳跃训练
跳跃训练
今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子,每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中,学员们共有多少种不同的跳跃方式。结果可能过大,因此结果需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
输入:n = 2输出:2
输入:n = 5输出:8
123456789101112131415161718var trainWays = function(n) { if (n < 2) return 1 let p = 1 let q = 1 let res = 2 for(let i = 2; i<n;i++){ // 每一次多加一步,前面的种类都不会变,因为新加的都是一步走了就行 // 那么只需要考虑最后一步是2步的情况,那么前面n-2的步数种类我也是知道的 // 那么n的种类就是fn(n - 2) + fn(n - 1)的种类 p = q q ...
第 N 个神奇数字
第 N 个神奇数字
一个正整数如果能被 a 或 b 整除,那么它是神奇的。给定三个整数 n , a , b ,返回第 n 个神奇的数字。因为答案可能很大,所以返回答案 对 109 + 7 取模 后的值。
输入:n = 1, a = 2, b = 3输出:2
输入:n = 4, a = 2, b = 3输出:6
12345678910111213141516171819202122232425262728293031323334const MOD = 10 ** 9 + 7;var nthMagicalNumber = function (n, a, b) { if (a > b) { return nthMagicalNumber(n, b, a); } if (b % a == 0) { return (a * n) % MOD; } // 求出a,b的最小公倍数以及中间的二者的倍数 const res = commonMultiple(a, b); ...
重新排序得到 2 的幂
重新排序得到 2 的幂
给定正整数 n ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
输入:n = 1输出:true
输入:n = 10输出:false
1234567891011121314var reorderedPowerOf2 = function(n) { const set = new Set(); // 一共有30个2的幂 for (let i = 0; i < 30; i++) { // 将每个2的幂的字符串排序后,放入set const str = String(2 ** i) .split('') .sort() .join(''); set.add(str); } // 查找n的字符串,排序后,有没有在set中出现过 retu ...