数对和
数对和
设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。
输入: 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) & ...
计算列车到站时间
计算列车到站时间
给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。返回列车实际到站的时间。注意,该问题中的时间采用 24 小时制。
输入:arrivalTime = 15, delayedTime = 5输出:20解释:列车正点到站时间是 15:00 ,延误 5 小时,所以列车实际到站的时间是 15 + 5 = 20(20:00)。
输入:arrivalTime = 13, delayedTime = 11输出:0解释:列车正点到站时间是 13:00 ,延误 11 小时,所以列车实际到站的时间是 13 + 11 = 24(在 24 小时制中表示为 00:00 ,所以返回 0)。
123var findDelayedArrivalTime = function(arrivalTime, delayedTime) { return (arrivalTime+delayedTime)%24;};
单调递增的数字
单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
输入: n = 10输出: 9
输入: n = 1234输出: 1234
1234567891011121314151617var monotoneIncreasingDigits = function(N) { let n = N.toString(); let arr = Array.from(n); // [x,x,x,x]; let max = N; for (let i = 1; i < arr.length; i++) { // 不是递增 if (arr[i - 1] > arr[i]) { const releng = arr.length - i; // 剩余长度 max = monotoneIncreasingDigits ...
平方数之和
平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
输入:c = 5输出:true解释:1 * 1 + 2 * 2 = 5
输入:c = 3输出:false
123456789var judgeSquareSum = function(c) { for (let a = 0; a * a <= c; a++) { let b = Math.floor(Math.sqrt(c - a * a)); if (a * a + b * b === c) { return true; } } return false;};
破冰游戏
破冰游戏
社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。
输入:num = 7, target = 4输出:1
输入:num = 12, target = 5输出:0
1234567var iceBreakingGame = function(num, target) { if (num === 1) { return 0; } let prevRemaining = iceBreakingGame(num - 1, target); return (prevRemaining + target) % num;};
最小和分割
最小和分割
给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足:num1 和 num2 直接连起来,得到 num 各数位的一个排列。换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。num1 和 num2 可以包含前导 0 。请你返回 num1 和 num2 可以得到的和的 最小 值。注意:num 保证没有前导 0 。num1 和 num2 中数位顺序可以与 num 中数位顺序不同。
输入:num = 4325输出:59解释:我们可以将 4325 分割成 num1 = 24 和 num2 = 35 ,和为 59 ,59 是最小和。
输入:num = 687输出:75解释:我们可以将 687 分割成 num1 = 68 和 num2 = 7 ,和为最优值 75 。
12345678var splitNum = function(num) { const s = num.toString().split('').sort(); const a = [0, 0]; ...
斐波那契数
斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 n ,请计算 F(n) 。答案需要取模 1e9+7(1000000007) ,如计算初始结果为:1000000008,请返回 1。
输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1
输入:n = 3输出:2解释:F(3) = F(2) + F(1) = 1 + 1 = 2
123456789var fib = function(n) { let n1 = 0, n2 = 1, sum; for(let i = 0; i < n; i++){ sum = (n1 + n2) % 1000000007; n1 = n2; n2 = sum; } return n1; ...