因为要为毕业之后的找工作做准备,所以大潘最近开始在leetcode上刷算法了,但是也不想花费太多时间,就计划了每天刷一道,每周回顾一下,我从上周三开始刷,到昨天为止正好刷了七道,分享到这里,如果有感兴趣的小伙伴可以一起讨论题目。我大致是跟着这个网站的顺序来刷的: https://programmercarl.com/ 因为我的方向是前端,所以我用的语言是JavaScript,下边是七道算法题及我的解题思路,欢迎小伙伴和我一起刷leetcode,有什么疑惑可以后台私信我哦~
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?
示例 :
输入: [2,2,1]
输出: 1
大潘的思路:
利用异或的规则,这是个很巧妙的思路
代码:
// 136. 数组中只出现一次的数字:
function singleNumber(nums) {
return nums.reduce((a, b) => a ^ b);
}
这里用到了一个很巧妙的计算规则:异或(^);也用到了js中的reduce()方法,对这个方法不了解的小伙伴看这个链接,很详细:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target,写一个函数搜索 nums中的 target,如果目标值存在返回下标,否则返回 -1。
示例 :
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
大潘的思路:
判断nums里面有没有target,有的话跳出for
循环,并且此时的 i 为target的下标,没有的话 i 会循环到nums.length
才跳出循环,此时说明nums中没有target
代码:
// 704 二分查找:
var search = function (nums, target) {
first: for (var i = 0; i < nums.length; i++) {
if (nums[i] == target) {
break first;
}
}
if (nums[i] == target) {
return i;
}
if (i == nums.length) {
return -1;
}
};
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 :
输入: nums = [1,3,5,6], target = 5
输出: 2
大潘的思路:
因为是有序排列的数组,所以我们可以依次遍历数组,判断数组中第一个比target大的值的索引(假设是i),然后判断在这个值之前的值是等于target还是小于target,如果等于target,那么直接返回i-1,否则返回i(因为target插入在了i-1+1的位置)。但是在做这个判断之前要先判断一下target是否在这个数组的范围之内。
代码:
// 35. 搜索插入位置
var searchInsert = function (nums, target) {
if (nums[nums.length - 1] < target) {
return nums.length;
} else if (nums[nums.length - 1] == target) {
return nums.length - 1;
}
for (let i = 0; i < nums.length; i++) {
if (nums[0] < target) {
if (nums[i] > target) {
if (nums[i - 1] == target) {
return i - 1;
} else if (nums[i - 1] < target) {
return i;
}
}
} else {
return 0;
}
}
};
题目描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 :
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
大潘的思路:
先判断数组nums中是否有target,有的话有几个?可以通过遍历nums判断数组中有几个target(假设有n个),如果n等于0,那么直接返回[-1,-1],如果n>0,在判断nums中出现target的第一个位置的索引是几(假设是i),然后返回[ i , i+n-1 ]
代码:
// 34_在排序数组中查找元素的第一个和最后一个位置
var searchRange = function (nums, target) {
var n = 0;
nums.forEach((e) => {
if (e == target) {
n++;
}
});
if (n == 0) {
return [-1, -1];
}
for (var i = 0; i < nums.length; i++) {
if (nums[i] == target) {
return [i, i + n - 1];
}
}
return arr;
};
题目描述:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去 。
注意:不允许使用任何内置指数函数和算符,例如pow(x, 0.5)
或者x ** 0.5
。
示例 :
输入:x = 4
输出:2
大潘的思路:
让i从零开始不断增大,直到i的平方大于x,返回i-1;如果正好i的平方等于x,返回i
代码:
// 69. x 的平方根
var mySqrt = function (x) {
for (let i = 0; i < x * x + 1; i++) {
if (i * i > x) {
return i - 1;
} else if (i * i == x) {
return i;
}
}
};
题目描述:
给定一个正整数 num,编写一个函数,如果 num是一个完全平方数,则返回 true,否则返回 false。
进阶:不要使用任何内置的库函数,如 sqrt。
示例 :
输入:num = 16
输出:true
大潘的思路:
与上边的69题类似,让i从零开始不断增大,直到i的平方大于x,判断(i-1)的平方是否等于x,是的话返回turn,否的话返回false
代码:
// 367. 有效的完全平方数
var isPerfectSquare = function (num) {
let i = 0;
while (i * i < num) {
i++;
}
return i * i == num;
};
题目描述:
给你一个数组 nums
和一个值val
,你需要原地移除所有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
示例 :
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
大潘的思路:
思路一:删除数组中值等于val的元素,并且返回此时数组的长度即可;
思路二:因为题目中描述了 “元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。” ,所以可以将数组nums中不等于val的元素依次赋值给前边的元素,最后返回数组中元素不等于val的个数即可
代码:
思路一:
// 27. 移除元素
var removeElement = function (nums, val) {
for (var i = 0; i < nums.length; i++) {
if (nums[i] == val) {
nums.splice(i, 1);
i--;//因为删掉了数组nums中的一个值,所以为了正常遍历后边的元素,i要减1
}
}
return i;
};
思路二:
// 27. 移除元素
var removeElement = function (nums, val) {
let n = 0;
for (var i = 0; i < nums.length; i++) {
if (nums[i] != val) {
nums[n] = nums[i];
n++;
}
}
return n;
};