温故而知新,可以为师矣

61 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情 >>

前言

本文主题是复习一些leetcode刷过的题,讲解思路,顺便复习一下基础的知识点,为了避免说拿题目水字数,题目以截图的形式出现。

求中位数

image.png

这道题我们看题干,其实可以转化为一个什么问题?其实就是两个数组,合并后再排序,然后取中位数的问题。 所以首先,我们需要将数组合并后进行排序

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let a = nums1.concat(nums2).sort((a,b) => a-b)
};

这里我们利用concat合并两个数组,并通过sort方法进行排序,这样得到的a就是一个有序数组了

接下来,就需要判断a的长度,如果长度是奇数,那我们直接取长度的1/2作为下标即可,如果是偶数,就需要取1/2下标及他的前一个加起来的和除以2 才是我们的中位数,这里为什么是 -1 而不是+1?因为下标从0开始的

if (a.length % 2 !== 0) {
        return a[Math.ceil(a.length /2)-1]
} else {
    return (a[Math.ceil(a.length /2)] + a[Math.ceil(a.length /2)-1]) / 2
}

字符串转换整数

image.png

/**
 * @param {string} s
 * @return {number}
 */
var myAtoi = function(s) {
    s = s.trim()
    if(!s) {
        return 0
    }
    let str = s[0]
    if(!str.startsWith('-') && !str.startsWith('+')) {
        if (!Number(str) && str !== '0') {
            return 0
        }
    }
   
   for (let i =1;i<s.length;i++) {
       if(Number(s[i]) || s[i] === '0') {
           str = str+ s[i]
       } else {
           break
       }
   }
    
    if(str.startsWith('-')) {
         if (Number(str)) {
     return Math.pow(-2,31) > str ?  Math.pow(-2,31):str
         } else {
             return 0
         }
    } else {
        if (Number(str)) {
        return Math.pow(2,31) <= str ? Math.pow(2,31)-1  : str

        } else {
            return 0
        }
    }
};

这里需要注意的有以下几点

  • s在trim之后假如是空字符串,直接return 0
  • s的首位不是-+且不等于0时,如果Number强制类型转换不成功 return 0
  • s按位步进,如果Number强制类型转换不成功或不等于0时,中断循环
  • 结果字符串str如果Number强制类型转换不成功 return 0
  • 结果字符串str如果以-开头,需要判断-2的31次方,如果不是,则需要判断2的31次方大于等于

结语

以上就是今天的温故,虽然第一题是困难,但是感觉第二题需要考虑的corner case 更多,也尝试了更多的次数,这个就是告诉我们,在写代码的时候,一定要考虑代码的健壮性,好的代码就是处理了各种各样的corner case。