最长乘积等价子数组
最长乘积等价子数组
给你一个由 正整数 组成的数组 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) ...
哈沙德数
哈沙德数
如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(Harshad number)。给你一个整数 x 。如果 x 是 哈沙德数 ,则返回 x 各个数位上的数字之和,否则,返回 -1 。
输入: x = 18输出: 9解释:x 各个数位上的数字之和为 9 。18 能被 9 整除。因此 18 是哈沙德数,答案是 9 。
输入: x = 23输出: -1解释:x 各个数位上的数字之和为 5 。23 不能被 5 整除。因此 23 不是哈沙德数,答案是 -1 。
1234567var sumOfTheDigitsOfHarshadNumber = function(x) { let s = 0; for (let v = x; v; v = Math.floor(v / 10)) { s += v % 10; } return x % s ? -1 : s;};
最常见的单词
最常见的单词
给你一个字符串 paragraph 和一个表示禁用词的字符串数组 banned ,返回出现频率最高的非禁用词。题目数据 保证 至少存在一个非禁用词,且答案 唯一 。paragraph 中的单词 不区分大小写 ,答案应以 小写 形式返回。
输入:paragraph = “Bob hit a ball, the hit BALL flew far after it was hit.”, banned = [“hit”]输出:”ball”解释:“hit” 出现了 3 次,但它是禁用词。“ball” 出现了两次(没有其他单词出现这么多次),因此它是段落中出现频率最高的非禁用词。请注意,段落中的单词不区分大小写,标点符号会被忽略(即使它们紧挨着单词,如 “ball,”),并且尽管 “hit” 出现的次数更多,但它不能作为答案,因为它是禁用词。
输入:paragraph = “a.”, banned = []输出:”a”
123456789101112131415var mostCommonWord = function(paragraph, banned) { ...
最长定差子序列
最长定差子序列
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
输入:arr = [1,2,3,4], difference = 1输出:4解释:最长的等差子序列是 [1,2,3,4]。
输入:arr = [1,3,5,7], difference = 1输出:1解释:最长的等差子序列是任意单个元素。
12345678910111213var longestSubsequence = function (arr, difference) { const map = new Map(); let ans = 1; for (const num of arr) { if (map.has(num - difference)) { const v = map.get(num - d ...
回旋镖的数量
回旋镖的数量
给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。返回平面上所有回旋镖的数量。
输入:points = [[0,0],[1,0],[2,0]]输出:2解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
输入:points = [[1,1],[2,2],[3,3]]输出:2
输入:points = [[1,1]]输出:0
12345678910111213141516171819202122var numberOfBoomerangs = function(points) { let count = 0; function calcDist(a, b) { return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2; } for (let i = ...
第 N 位数字
第 N 位数字
给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。
输入:n = 3输出:3
输入:n = 11输出:0解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是 0 ,它是 10 的一部分。
123456789101112131415161718192021var findNthDigit = function (n) { // 小于10返回本身 if (n <= 9) { return n; } let bit = 1; // 数字的长度 let p = 9; while (n - bit * p > 0) { n -= bit * p; bit++; p *= 10; } // num 目标数字 let num = Math.po ...
超级次方
超级次方
计算 a^b 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
输入:a = 2, b = [3]输出:8
输入:a = 2, b = [1,0]输出:1024
1234567891011121314var superPow = function (a, b) { const MOD = 1337; let res = 1; a %= MOD; for(let i = b.length - 1; i >= 0; i--){ let k = 1; for(let j = 0; j < 10; j++){ if(j == b[i]) res = res * k % MOD; k = k * a % MOD; } a = k; } return res;};