这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
18. 删除排序数组中的重复项 (remove-duplicates-from-sorted-array)
标签
- 双指针
- 快慢指针
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个有序数组 nums,对数组中的元素进行去重,使得原数组中的每个元素只有一个。最后返回去重以后数组的长度值。
基本思路
- 数组完成排序后,我们可以放置两个指针
i 和 j,其中 i 是慢指针,而 j 是快指针。只要nums[i] === nums[j],我们就增加j跳过重复项。 - 当我们遇到
nums[j] !== nums[i]时,跳过重复项的运行已经结束,因此我们必须把nums[j]的值复制到nums[i + 1]。 - 然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。
写法实现
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
// 特判
if (nums.length === 0) {
return 0
}
let i = 0
for (j = 1; j < nums.length; j++) {
if (nums[j] !== nums[i]) {
i++
nums[i] = nums[j]
}
}
return i + 1
};
19. 移除元素 (remove-element)
标签
- 双指针
- 快慢指针
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
给定一个数组 nums 和一个数值 val,将数组中所有等于 val 的元素删除,并返回剩余的元素个数。根上一题基本相同思路就行。
基本思路
- 还是用两个指针
i和j,其中i是慢指针,j是快指针。 - 上一题是跳重复元素,这题更简单,比较是否等于
val就行了。当nums[j] === val时,递增 j 跳过该元素。 - 只要
nums[j] !== val我们就复制nums[j]到nums[i]并同时递增两个索引。 - 重复这一过程,直到 j 到达数组的末尾,该数组的新长度为 i。
写法实现
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let i = 0
for (j = 0; j < nums.length; j++) {
if (nums[j] !== val) {
nums[i] = nums[j]
i++
}
}
return i
};
20. 两数相除 (divide-two-integers)
标签
- 数学
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。
基本思路
相关资料,使用快速幂思想,这个讲起来相对复杂,这只是梳理,就不多说了。有兴趣自己看文档。
写法实现
var divide = function(dividend, divisor) {
// 符号
let sign = true
if (dividend < 0) {
dividend = 0 - dividend
sign = !sign
}
if (divisor < 0) {
divisor = 0 - divisor
sign = !sign
}
if (divisor > dividend) {
return 0
}
let [res, mul_divisor] = [1, divisor]
while (dividend > mul_divisor + mul_divisor) {
res += res
mul_divisor += mul_divisor
}
res = res + divide(dividend - mul_divisor, divisor)
if (!sign) {
res = 0 - res
}
res = res >= 2147483648 ? 2147483647 : res
res = res <= -2147483648 ? -2147483648 : res
return res
};
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,暗号对不上不加哈
参考