跳跃游戏
跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
123456789101112131415var canJump = function(nums) { let dp = new Array(nums.length).fill(false); //初始化dp dp[0] = true; //第一项能到达 for (let i = 1; i < nums.length; i++) { for (let j = 0; j &l ...
字符串相乘
字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
输入: num1 = “2”, num2 = “3”
输出: “6”
输入: num1 = “123”, num2 = “456”
输出: “56088”
12345678910111213141516171819var multiply = function(num1, num2) { if (num1 === '0' || num2 === '0') return '0' let len1 = num1.length, len2 = num2.length, res = new Array(len1 + len2).fill(0) // 结果最多为 m + n 位数 for (let i = len1 - 1; i >= 0; i--) { ...
三数之和
三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
1234567891011121314151617181920212223var threeSum = function(nums) { nums.sort((a, b) => a - b); const n = nums.length; const ans = []; for (let i = 0; i < n - 2; i++) { const x = nums[i]; if ( ...
字符串相加
字符串相加
给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
输入:num1 = “11”, num2 = “123”
输出:”134”
输入:num1 = “456”, num2 = “77”
输出:”533”
1234567891011121314151617181920212223242526var addStrings = function(num1, num2) { // 结果 let base = 10 let result = ''; // 进位标记 let carry = 0; // 设置 a、b 的长度,方便逆序遍历 let num1Index = num1.length - 1, num2Index = num2.length - 1; while (num1Index >= 0 || num2Index >= 0) { // nu ...
两个数组的交集 II
两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
12345678910111213141516171819202122var intersect = function(nums1, nums2) { const map = {}; const res = []; if (nums1.length < nums2.length) { [nums1, nums2] = [nums2, nums1] } for (const num1 of nums1) {//nums1中各个元素的频次 ...
x 的平方根
x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
输入:x = 4
输出:2
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
12345678910var mySqrt = function(x) { if (x==0 || x ==1) { return x; } for (let i=0; i<=x;i++){ if (i*i<=x && (i+1)*(i+1)>x){ return i; } }};
重复的子字符串
重复的子字符串
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
输入: s = “abab”
输出: true
解释: 可由子串 “ab” 重复两次构成。
输入: s = “aba”
输出: false
12345678var repeatedSubstringPattern = function(s) { // s = s.split(''); // const data = [...new Set(s)]; // return s.length % data.length === 0 && s.length !== data.length ? true : false; const str = s + s; return str.substring(1, str.length - 1).includes(s)};
第三大的数
第三大的数
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
12345678910var thirdMax = function(nums) { let temp = Array.from(new Set(nums)).sort((a, b) => { return b - a }) let len = temp.length if (len < 3) { return temp[0] } return temp[2]};
完美数
完美数
对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。
输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 141, 2, 4, 7, 和 14 是 28 的所有正因子。
输入:num = 7
输出:false
12345678910111213141516171819var checkPerfectNumber = function(num) { if(num == 1) { return false; } let sum = 1; // 正整数一定会有一个1,同时不用考虑自身,所以单独处理 let i = 2; const sqrt = Math.sqrt(num); for(;i < sqrt;i++) { if(num % i == 0) { sum += i; ...
判断子序列
判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,”ace”是”abcde”的一个子序列,而”aec”不是)。
输入:s = “abc”, t = “ahbgdc”
输出:true
输入:s = “axc”, t = “ahbgdc”
输出:false
12345678910111213var isSubsequence = function(s, t) { if (subStr.length == 0) return true; let i = 0; while (i < str.length) { if (subStr[0] == str[i]) { const rest_sub = subStr.substring(1); // 剩余subStr const rest_str = str.substring(i + 1); // 剩余str retur ...