砍竹子 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 ...
最大二进制奇数
最大二进制奇数
给你一个 二进制 字符串 s ,其中至少包含一个 ‘1’ 。你必须按某种方式 重新排列 字符串中的位,使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。以字符串形式,表示并返回可以由给定组合生成的最大二进制奇数。注意 返回的结果字符串 可以 含前导零。
输入:s = “010”输出:”001”解释:因为字符串 s 中仅有一个 ‘1’ ,其必须出现在最后一位上。所以答案是 “001” 。
输入:s = “0101”输出:”1001”解释:其中一个 ‘1’ 必须出现在最后一位上。而由剩下的数字可以生产的最大数字是 “100” 。所以答案是 “1001” 。
12345678910var maximumOddBinaryNumber = function(s) { const arr = s.split('').sort((a, b) => b - a); for (let i = 0; i < arr.length - 1; i++) { if (arr[i] !== arr[i + ...
最长乘积等价子数组
最长乘积等价子数组
给你一个由 正整数 组成的数组 nums。如果一个数组 arr 满足 prod(arr) == lcm(arr) * gcd(arr),则称其为 乘积等价数组 ,其中:prod(arr) 表示 arr 中所有元素的乘积。gcd(arr) 表示 arr 中所有元素的最大公因数 ( GCD )。lcm(arr) 表示 arr 中所有元素的最小公倍数 ( LCM )。返回数组 nums 的 最长 乘积等价子数组的长度。
输入: nums = [1,2,1,2,1,1,1]输出: 5解释:最长的乘积等价子数组是 [1, 2, 1, 1, 1],其中 prod([1, 2, 1, 1, 1]) = 2, gcd([1, 2, 1, 1, 1]) = 1,以及 lcm([1, 2, 1, 1, 1]) = 2。
输入: nums = [2,3,4,5,6]输出: 3解释:最长的乘积等价子数组是 [3, 4, 5]。
12345678910111213141516171819202122232425262728293031var maxLength = function ...
第K个语法符号
第 K 个语法符号
我们构建了一个包含 n 行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的 0 替换为 01,1 替换为 10。例如,对于 n = 3 ,第 1 行是 0 ,第 2 行是 01 ,第 3 行是 0110 。给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始)
输入: n = 1, k = 1输出: 0解释: 第一行:0
输入: n = 2, k = 1输出: 0解释:第一行: 0第二行: 01
123456var kthGrammar = function (n, k) { if (n === 1) { return 0; } return (k & 1) ^ 1 ^ kthGrammar(n - 1, (k + 1) / 2);};
将钱分给最多的儿童
将钱分给最多的儿童
给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。你需要按照如下规则分配:所有的钱都必须被分配。每个儿童至少获得 1 美元。没有人获得 4 美元。请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1 。
输入:money = 20, children = 3输出:1解释:最多获得 8 美元的儿童数为 1 。一种分配方案为:
给第一个儿童分配 8 美元。
给第二个儿童分配 9 美元。
给第三个儿童分配 3 美元。没有分配方案能让获得 8 美元的儿童数超过 1 。
输入:money = 16, children = 2输出:2解释:每个儿童都可以获得 8 美元。
12345678910111213141516171819202122232425var distMoney = function(money, children) { // 不够分时返回-1 if (money < children) return ...
递枕头
递枕头
n 个人站成一排,按从 1 到 n 编号。最初,排在队首的第一个人拿着一个枕头。每秒钟,拿着枕头的人会将枕头传递给队伍中的下一个人。一旦枕头到达队首或队尾,传递方向就会改变,队伍会继续沿相反方向传递枕头。例如,当枕头到达第 n 个人时,TA 会将枕头传递给第 n - 1 个人,然后传递给第 n - 2 个人,依此类推。给你两个正整数 n 和 time ,返回 time 秒后拿着枕头的人的编号。
输入:n = 4, time = 5输出:2解释:队伍中枕头的传递情况为:1 -> 2 -> 3 -> 4 -> 3 -> 2 。5 秒后,枕头传递到第 2 个人手中。
输入:n = 3, time = 2输出:3解释:队伍中枕头的传递情况为:1 -> 2 -> 3 。2 秒后,枕头传递到第 3 个人手中。
1234567891011var passThePillow = function(n, time) { let num = 1, direction = 1; while (time > 0) ...