哈沙德数
哈沙德数
如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(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;};
数对和
数对和
设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。
输入: nums = [5,6,5], target = 11输出: [[5,6]]
输入: nums = [5,6,5,6], target = 11输出: [[5,6],[5,6]]
123456789101112131415161718var pairSums = function(nums, target) { const n = nums.length; const used = new Int32Array(n); const map = new Map(); const result = []; nums.forEach((num, index) => { const extra = target - num; if(map.has(extra) && map.get(extra) > 0) { const count = map.get(extra) || 0 map.set ...
排序链表
排序链表
给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
输入:head = [4,2,1,3]输出:[1,2,3,4]
输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]
12345678910111213141516171819var sortList = function(head) { var arr = [] var p = head while (p) { arr.push(p) p = p.next } arr.sort((a, b) => a.val - b.val) var len = arr.length - 1 for (var i = 0; i < len; i++) { arr[i].next = arr[i + 1] } if(!arr.length) { return null } arr[len].next = null return arr[0]} ...
前 K 个高频元素
前 K 个高频元素
给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。
输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]
输入: nums = [1], k = 1输出: [1]
123456789101112131415var topKFrequent = function (nums, k) { let map = new Map() let arr = [] let res = [] nums.forEach(item => { map.has(item) ? map.set(item, map.get(item) + 1) : map.set(item, 1) }) // 根据value值从大到小排序 arr = Array.from(map).sort((a, b) => b[1] - a[1]) arr = arr.splice(0, k) for (let i = ...
统计对称整数的数目
统计对称整数的数目
给你两个正整数 low 和 high 。对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字之和相等,则认为这个数字是一个对称整数。返回在 [low, high] 范围内的 对称整数的数目 。
输入:low = 1, high = 100输出:9解释:在 1 到 100 范围内共有 9 个对称整数:11、22、33、44、55、66、77、88 和 99 。
输入:low = 1200, high = 1230输出:4解释:在 1200 到 1230 范围内共有 4 个对称整数:1203、1212、1221 和 1230 。
12345678910111213141516var countSymmetricIntegers = function(low, high) { let ans = 0; for(let i = low; i <= high; i++) { let str = String(i); if(str.length % 2 == 0) & ...