携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情 >>
前言
本文主题是复习一些leetcode刷过的题,讲解思路,顺便复习一下基础的知识点,为了避免说拿题目水字数,题目以截图的形式出现。
求中位数
这道题我们看题干,其实可以转化为一个什么问题?其实就是两个数组,合并后再排序,然后取中位数的问题。 所以首先,我们需要将数组合并后进行排序
/**
* @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
}
字符串转换整数
/**
* @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。