写在前面
之前一直没有关注过刷题这块内容,现在感觉要重视起来。
这篇文章主要是记录自己的刷题过程, 再加上这批题其实是新手村的,没有很复杂的题目,所以实际观赏意义不大
来源于: LeetCode
一维数组的动态和
给定一个数组 nums, 经过动态和算法,需要得到预期结果
动态和
数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i])
示例 1:
输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4]
示例 2:
输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1]
结果
/**
* @param {number[]} nums
* @return {number[]}
*/
var runningSum = function(nums) {
if(nums.length <= 0){
return []
}
for(var i = 1;i<nums.length;i++){
nums[i] += nums[i-1]
}
return nums
}
//log结果
输入
[3,1,2,10,1]
输出
[3,4,6,16,17]
预期结果
[3,4,6,16,17]
赎金信
给定两个字符串ransomNote和magazine, 判断ransomNote能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false
magazine 中的每个字符只能在 ransomNote 中使用一次
示例 1:
输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab"
输出:true
结果
既然想将源字符串拼接成目标字符串,我们就需要拆分magazine并且得到每个字符出现的次数同时跟ransomNote中字符进行数量比对
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
function ransom(ransomNote,magazine){
//如果源字符串长度还不如目标字符串,直接退出
if(magazine.length - ransomNote.lenght<0){return false;}
var letters = new Array(26).fill(0);
for (const mag of magazine){
letters[mag.charCodeAt() - 'a'.charCodeAt()]++
}
for (const ran of ransomNote){
letters[ran.charCodeAt() - 'a'.charCodeAt()]--;
if(letters[ran.charCodeAt() - 'a'.charCodeAt()] < 0){
return false
}
}
return true
}
相关内容:
'a'.charCodeAt() = 97
'b'.charCodeAt() = 98
...
'y'.charCodeAt() = 121
'z'.charCodeAt() = 122
从1-n的FizzBuzz表示
给定一个整数n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中:
answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。
answer[i] == "Fizz" 如果 i 是 3 的倍数。
answer[i] == "Buzz" 如果 i 是 5 的倍数。
answer[i] == i (以字符串形式)如果上述条件全不满足。
示例 1:
输入:n = 3
输出:["1","2","Fizz"]
示例 2:
输入:n = 5
输出:["1","2","Fizz","4","Buzz"]
示例 3:
输入:n = 15
输出:["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]
结果
取余和除法相关
/**
* @param {number} n
* @return {string[]}
*/
var fizzBuzz = function(n) {
var answer = new Array(n)
for(var i = 0; i < n; i++){
answer[i] = ''
if((i+1) % 3 == 0) answer[i] += 'Fizz'
if((i+1) % 5 == 0) answer[i] += 'Buzz'
if(!answer[i]) answer[i] = String(i+1)
}
return answer;
}
将数字变为0的操作次数
给定一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
示例:
输入:num = 14
输出:6
解释:
步骤 1) 14 是偶数,除以 2 得到 7
步骤 2) 7 是奇数,减 1 得到 6
步骤 3) 6 是偶数,除以 2 得到 3
步骤 4) 3 是奇数,减 1 得到 2
步骤 5) 2 是偶数,除以 2 得到 1
步骤 6) 1 是奇数,减 1 得到 0
结果
/**
* @param {number} num
* @return {number}
*/
var numberOfSteps = function(num) {
var count = 0
while(num){
num = num % 2 == 0?num /2 : num -1
count++
}
return count
};
最富有客户的资产总量
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
这个题其实就是一个二维数组,二维数组的每一个元素是一维数组。我们要计算每一个子元素数组中所有值的和,然后返回相加和最大的一个
示例 3:
输入: accounts = [[2,8,7],[7,1,3],[1,9,5]]
输出: 17
结果
无非就是拆开二维数组,然后开始计算总和。
/**
* @param {number[][]} accounts
* @return {number}
*/
var maximumWealth = function(accounts) {
var max = 0
for(var account of accounts){
max = Math.max(max,account.reduce((val,next) => val + next))
}
return max
};