日期之间隔几天
日期之间隔几天
请你编写一个程序来计算两个日期之间隔了多少天。日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。
输入:date1 = “2019-06-29”, date2 = “2019-06-30”
输出:1
输入:date1 = “2020-01-15”, date2 = “2019-12-31”
输出:15
12345var daysBetweenDates = function(date1, date2) { date1 = new Date(date1).getTime(); date2 = new Date(date2).getTime(); return Math.abs(date1 - date2) / 1000 / 60 / 60 / 24;};
最小覆盖子串
最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串,我们保证它是唯一的答案。
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:”BANC”解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、’B’ 和 ‘C’。
输入:s = “a”, t = “a”
输出:”a”解释:整个字符串 s 是最小覆盖子串。
12345678910111213141516171819202122232425262728293031323334353637383940var minWindow = function(s, t) { let need = {};//需要覆盖的字符串频数 let window = {};//滑动窗口的字符串频数 for (let a of t) ...
检查两个字符串数组是否相等
检查两个字符串数组是否相等
给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。
输入:word1 = [“ab”, “c”], word2 = [“a”, “bc”]
输出:true解释:word1 表示的字符串为 “ab” + “c” -> “abc”word2 表示的字符串为 “a” + “bc” -> “abc”两个字符串相同,返回 true
输入:word1 = [“a”, “cb”], word2 = [“ab”, “c”]
输出:false
123var arrayStringsAreEqual = function(word1, word2) { return word1.join("") === word2.join("");};
摧毁小行星
摧毁小行星
给你一个整数 mass ,它表示一颗行星的初始质量。再给你一个整数数组 asteroids ,其中 asteroids[i] 是第 i 颗小行星的质量。你可以按 任意顺序 重新安排小行星的顺序,然后让行星跟它们发生碰撞。如果行星碰撞时的质量 大于等于 小行星的质量,那么小行星被 摧毁 ,并且行星会 获得 这颗小行星的质量。否则,行星将被摧毁。如果所有小行星 都 能被摧毁,请返回 true ,否则返回 false 。
输入:mass = 10, asteroids = [3,9,19,5,21]
输出:true解释:一种安排小行星的方式为 [9,19,5,3,21] :
行星与质量为 9 的小行星碰撞。新的行星质量为:10 + 9 = 19
行星与质量为 19 的小行星碰撞。新的行星质量为:19 + 19 = 38
行星与质量为 5 的小行星碰撞。新的行星质量为:38 + 5 = 43
行星与质量为 3 的小行星碰撞。新的行星质量为:43 + 3 = 46
行星与质量为 21 的小行星碰撞。新的行星质量为:46 + 21 = 67所有小行星都被摧毁。
输入: ...
乘积最大子数组
乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。
输入: nums = [2,3,-2,4]
输出: 6解释: 子数组 [2,3] 有最大乘积 6。
输入: nums = [-2,0,-1]
输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
123456789101112// 维护当前的最小值,如果当前元素是负值,交换最小值和最大值的值再相乘,// 因为存在负数会使当前最小的变成最大的,最大的变成最小的var maxProduct = function(nums) { let ans = -Infinity,imax = 1,imin = 1; for(const num of nums) { if(num < 0) [imax,imin] = [imin,imax] imax = Math.max(imax*num,num); imin ...
直线上最多的点数
直线上最多的点数
给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。
输入:points = [[1,1],[2,2],[3,3]]
输出:3
输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4
123456789101112131415161718192021222324252627var maxPoints = function(points) { let ans = 1; const n = points.length, map = new Map(); for (let i = 0; i < n; i++) { if (ans >= n - i) break; const x1 = points[i][0], y1 = points[i][1]; for (let j = i + 1; j < n; j++) { ...
整数的各位积和之差
整数的各位积和之差
给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
输入:n = 234
输出:15解释:各位数之积 = 2 _ 3 _ 4 = 24各位数之和 = 2 + 3 + 4 = 9结果 = 24 - 9 = 15
输入:n = 4421
输出:21解释:各位数之积 = 4 _ 4 _ 2 * 1 = 32各位数之和 = 4 + 4 + 2 + 1 = 11结果 = 32 - 11 = 21
123456var subtractProductAndSum = function(n) { let arr = n.toString().split(''); let a = eval(arr.join('*')); let b = eval(arr.join('+')); return a-b;};
找到和最大的长度为 K 的子序列
找到和最大的长度为 K 的子序列
给你一个整数数组 nums 和一个整数 k 。你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 。请你返回 任意 一个长度为 k 的整数子序列。子序列 定义为从一个数组里删除一些元素后,不改变剩下元素的顺序得到的数组。
输入:nums = [2,1,3,3], k = 2
输出:[3,3]解释:子序列有最大和:3 + 3 = 6 。
输入:nums = [-1,-2,3,4], k = 3
输出:[-1,3,4]解释:子序列有最大和:-1 + 3 + 4 = 6 。
123456789101112var maxSubsequence = function(nums, k) { nums = nums.map((item,index) => { return { item, index } }) nums = nums.sort((a,b) => b.item - ...
和有限的最长子序列
和有限的最长子序列
给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。注意 ,如果最小值或者最大值有重复元素,可以删除任意一个。
输入:nums = [4,5,2,1], queries = [3,10,21]
输出:[2,3,4]解释:queries 对应的 answer 如下:
子序列 [2,1] 的和小于或等于 3 。可以证明满足题目要求的子序列的最大长度是 2 ,所以 answer[0] = 2 。
子序列 [4,5,1] 的和小于或等于 10 。可以证明满足题目要求的子序列的最大长度是 3 ,所以 answer[1] = 3 。
子序列 [4,5,2,1] 的和小于或等于 21 。可以证明满足题目要求的子序列的最大长度是 4 ,所以 answer[2] = 4 。
输入:nums = ...
不同的平均值数目
不同的平均值数目
给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。只要 nums 不是 空数组,你就重复执行以下步骤:找到 nums 中的最小值,并删除它。找到 nums 中的最大值,并删除它。计算删除两数的平均值。两数 a 和 b 的 平均值 为 (a + b) / 2 。比方说,2 和 3 的平均值是 (2 + 3) / 2 = 2.5 。返回上述过程能得到的 不同 平均值的数目。
注意 ,如果最小值或者最大值有重复元素,可以删除任意一个。
输入:nums = [4,1,4,0,3,5]
输出:2解释:
删除 0 和 5 ,平均值是 (0 + 5) / 2 = 2.5 ,现在 nums = [4,1,4,3] 。
删除 1 和 4 ,平均值是 (1 + 4) / 2 = 2.5 ,现在 nums = [4,3] 。
删除 3 和 4 ,平均值是 (3 + 4) / 2 = 3.5 。2.5 ,2.5 和 3.5 之中总共有 2 个不同的数,我们返回 2 。
12345678var distinctAverages = function(nums) { ...