每日刷题(新手村)

188 阅读1分钟

写在前面

之前一直没有关注过刷题这块内容,现在感觉要重视起来。
这篇文章主要是记录自己的刷题过程, 再加上这批题其实是新手村的,没有很复杂的题目,所以实际观赏意义不大

来源于: 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]

赎金信

给定两个字符串ransomNotemagazine, 判断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
};