子集
子集
给一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
输入:nums = [0]
输出:[[],[0]]
1234567891011121314var subsets = function(nums) { let result = [] let path = [] function backtracking(startIndex) { result.push([...path]) for(let i = startIndex; i < nums.length; i++) { path.push(nums[i]) backtracking(i + 1) path.pop() } ...
组合
组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。
输入:n = 4, k = 2
输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]
123456789101112131415var combine = function(n, k) { let ret = [] const helper = (start, prev) => { for(let i = start; i <= n; i++) { // 第一层 const cur = prev.concat(i) if (cur.length === k) { // 出口条件 ret.push(cur) } else { helper(i + 1, cur) // 第二层 } ...
整数反转
整数反转
给一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
输入:x = 123
输出:321
输入:x = -123
输出:-321
12345var reverse = function(x) { x = (Number)((x>=0?"+":"-")+[...String(x)].map(String).filter(e=>{return e+1>0}).sort(()=>-1).join("")) if(x<-(2**31)||x>2**31-1) return 0; return x;};
自除数
自除数
自除数 是指可以被它包含的每一位数整除的数。例如,128 是一个 自除数 ,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。自除数 不允许包含 0 。给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。
输入:left = 1, right = 22
输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
1234567891011121314151617var selfDividingNumbers = function(left, right) { check = function(num) { let x = num while(x > 0) { const t = x % 10 if(t == 0 || num % t != 0) break x = Math ...
排列硬币
排列硬币
总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。给一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
输入:n = 5
输出:2
解释:因为第三行不完整,所以返回 2 。
12345678910var arrangeCoins = function(n) { let total = 0; let line = 0; for (let index = 0; index < n; index++) { total += index + 1; if (total > n) break; line++ } return line;};
检测大写字母
找不同
我们定义,在以下情况时,单词的大写用法是正确的:全部字母都是大写,比如 “USA” 。单词中所有字母都不是大写,比如 “leetcode” 。如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
输入:word = “USA”
输出:true
12345678910var detectCapitalUse = function(word) { if(word.toUpperCase() == word || word.toLowerCase() == word) return true; let first = word[0]; if(first!==first.toUpperCase()) return false; else{ word = word.split('').splice(1).join(''); if(word.toLowerCase() ...
找不同
找不同
给定两个字符串 s 和 t ,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。
输入:s = “abcd”, t = “abcde”
输出:”e”
解释:’e’ 是那个被添加的字母。
123456789101112131415var findTheDifference = function(s, t) { const map = new Map(); for(let i = 0; i < s.length; i++) { const val = map.get(s[i]); map.set(s[i], val === undefined ? 1 : val + 1); } for(let i = 0; i < t.length; i++) { const val = map.get(t[i]); if(val === 0 || val === undefined) { ...
4的幂
4 的幂
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
输入:n = 16
输出:true
123456789101112var isPowerOfFour = function(num) { if(num <= 0 ) return false if(num === 1) return true if(num % 4 != 0 ) return false for(var i = 4; i<=num; i=i*4){ if(num == i){ return true } } return false};
三个数的最大乘积
三个数的最大乘积
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
输入:nums = [1,2,3]
输出:6
输入:nums = [1,2,3,4]
输出:24
输入:nums = [-1,-2,-3]
输出:-6
12345678910111213var maximumProduct = function(nums) { // 题目分析 找出三个数组成的最大乘积 // 排序+多种条件判断 找出最大三个即可 if (nums && Array.isArray(nums) && nums.length >= 3) { nums.sort((a, b) => a - b) // 最大值是0 // 最大值 <0 // 最大值 > 0[包括有负数、无负数情况 // 实际上我们只需要关注索引为 0 , 1, ..., n-3, n-2, n-1。这5个数 cons ...
比特位计数
比特位计数
给一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
输入:n = 2
输出:[0,1,1]
解释:0 –> 01 –> 12 –> 10
输入:n = 5
输出:[0,1,1,2,1,2]
解释:0 –> 01 –> 12 –> 103 –> 114 –> 1005 –> 101
123456789101112var countBits = function(n) { let dp = []; dp[0] = 0; for(let i = 1; i<=num; i++){ if(i % 2 == 1){ dp[i] = dp[i-1] + 1; }else{ dp[i] = dp[i/2]; } } r ...