算法从入门到放弃 -- leetcode新手村入门刷题

172 阅读1分钟

一:一维数组的动态和

题目: 截屏2022-11-01 上午10.40.02.png 思路和算法: 截屏2022-11-01 下午3.13.05.png 代码一:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var runningSum = function(nums) {
    var sum = 0
    var arr = nums.map((item) => {
        sum = sum + item
        return sum
    })
    return arr
};

知识点: map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。

代码二:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var runningSum = function(nums) {
    const n = nums.length
    for(let i = 1; i < n; i++) {
        nums[i] += nums[i-1]
    }
    return nums
};

二:赎金信

题目: 截屏2022-11-01 下午5.42.52.png 思路和算法:

题目要求使用字符串magazine 中的字符来构建新的字符串ransomNote,且ransomNote 中的每个字符只能使用一次,只需要满足字符串magazine中的每个英文字母(’a’-’z’)的统计次数都大于等ransomNote中相同字母的统计次数即可。

magazine.length _ ra.png

代码一:

/**
 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function(ransomNote, magazine) {
    if(ransomNote.length > magazine.length){
        return false
    }
    var ransomNoteArray = new Array(26).fill(0)
    var magazineArray = new Array(26).fill(0)
    for(let item of ransomNote){
        ransomNoteArray[item.charCodeAt() - 'a'.charCodeAt()]++
    }
    for(let item of magazine){
        magazineArray[item.charCodeAt() - 'a'.charCodeAt()]++
    }
    for(let i = 0; i < 26; i++){
        if(magazineArray[i] < ransomNoteArray[i]){
            return false
        }
    }
    return true
};

代码二(官方参考答案):

 * @param {string} ransomNote
 * @param {string} magazine
 * @return {boolean}
 */
var canConstruct = function(ransomNote, magazine) {
    if(ransomNote.length > magazine.length){
        return false
    }
    const cntArray = new Array(26).fill(0)
    for(let item of magazine){
        cntArray[item.charCodeAt() - 'a'.charCodeAt()]++
    }
    for(let item of ransomNote){
        cntArray[item.charCodeAt() - 'a'.charCodeAt()]--
        if(cntArray[item.charCodeAt() - 'a'.charCodeAt()] < 0){
            return false
        }
    }
    return true
};

三:Fizz Buzz

题目: 截屏2022-11-02 上午10.37.55.png 代码一:

/**
 * @param {number} n
 * @return {string[]}
 */
var fizzBuzz = function(n) {
    var array = new Array(n).fill(0)
    var newArray = array.map((item,index)=> {
        if((index+1)%3 === 0 && (index+1)%5 === 0){
            return 'FizzBuzz'
        }else if((index+1)%3 === 0){
            return 'Fizz'
        }else if((index+1)%5 === 0){
            return 'Buzz'
        }else{
            return (index + 1).toString()
        }
    })
    return newArray
};

代码二(官方参考答案):

/**
 * @param {number} n
 * @return {string[]}
 */
var fizzBuzz = function(n) {
    const answer = []
    for(let i = 1; i <= n; i++){
        const cb = []
        if(i % 3 === 0){
            cb.push("Fizz")
        }
        if(i % 5 === 0){
            cb.push("Buzz")
        }
        if(cb.length === 0){
            cb.push(i)
        }
        answer.push(cb.join(''))
    }
    return answer
};

四:链表的中间结点

题目:

截屏2022-11-03 下午3.09.31.png 知识点:

一:链表

什么是链表: 用一组任意存储的单元来存储线性表的数据元素。一个对象存储着本身的值和下一个元素的地址。

截屏2022-11-03 下午3.27.28.png

特点:

1,需要遍历才能查询到元素,查询慢。

2,插入元素只需断开连接重新赋值,插入快。

二:Math.trunc 用法:

Math.trunc(value)

参数:该函数接受单个参数值。它是要发送到Math.trunc()函数的浮点数。

返回值:Math.trunc()函数返回给定数字的整数部分。

代码一:

思路:将链表转换成数组

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var middleNode = function(head) {
    var array = []
    while(head){
        array.push(head)
        head = head.next
    }
    return array[Math.trunc(array.length/2)]
};

官方参考答案

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var middleNode = function(head) {
    var array = [head]
    while(array[array.length-1].next != null){
        array.push(array[array.length-1].next)
    }
    return array[Math.trunc(array.length/2)]
};

代码二:

思路:快慢指针

说明:用两个指针slow与fast一起遍历链表。slow一次走一步,fast一次走两步。那么当fast到达链表的末尾时,slow必然位于中间。

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var middleNode = function(head) {
    var fast = slow = head
    while(fast && fast.next){
        slow = slow.next
        fast = fast.next.next
    }
    return slow
};

五:将数字变成 0 的操作次数

题目: 截屏2022-11-04 上午11.26.16.png 代码一

/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps = function(num) {
    let ret = 0
    while(num > 0){
        if(num % 2 === 0){
            num = num / 2
        }else{
            num--
        }
        ret++
    }
    return ret
};

代码二(官方答案)

/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps = function(num) {
    let ret = 0
    while(num > 0){
        ret += (num > 1 ? 1 : 0) + (num & 0x01) // 判断奇偶
        num >>= 1 // 右位移1位并且赋值
    }
    return ret
};

六:最富有客户的资产总量

题目:

截屏2022-11-06 上午11.50.03.png 思路:二维数组遍历的问题

代码一:

/**
 * @param {number[][]} accounts
 * @return {number}
 */
var maximumWealth = function(accounts) {
    let sum = new Array(accounts.length).fill(0)
    for(let i = 0; i < accounts.length; i++) {
        for(let j = 0; j < accounts[i].length; j++){
            sum[i] +=  accounts[i][j]
        }
    }
    return Math.max(...sum)
};

代码二(官方答案):

MAX_VALUE

Number.MAX_VALUE 属性表示在 JavaScript 里所能表示的最大数值。

Array.prototype.reduce()

reduce()  方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

/**
 * @param {number[][]} accounts
 * @return {number}
 */
var maximumWealth = function(accounts) {
    let maxWealth = -Number.MAX_VALUE
    for(const account of accounts){
        maxWealth = Math.max(maxWealth, account.reduce((a,b) => a+b))
    }
    return maxWealth
};