移除元素
题27
给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
注意题目要求:返回数组的新长度,数组是旧的只是内容被重新覆盖了
题26
给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有k个元素,那么nums的前k个元素应该保存最终结果。
将最终结果插入nums的前k个位置后返回k 。
个人思路:还是使用双指针,如果fast和fast+1指向的元素不相同,slow保存fast指向的元素。
题283
给定一个数组 `nums`,编写一个函数将所有 `0` 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
个人思路:用双指针,fast指针判断是不是0,不是0就放入num[slow],是0就用计数器count加上。最后再将num[slow~slow+count)赋值为0.
更好的思路:快指针指向的不等于0的元素,把它跟慢指针指向的元素交换,当快指针走到末尾的时候,其实已经全部交换完毕了,前面的都是不为0的元素,后面的都是0的元素了
let moveZeroes = function (nums) {
let fast = 0,
slow = 0;
while (fast < nums.length) {
if (nums[fast] != 0) {
[nums[fast], nums[slow]] = [nums[slow], nums[fast]];
slow++;
}
fast++;
}
};
题844
给定s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
思路:遇到这种题目前进后退的就要想到栈!
题977
给你一个按非递减顺序排序的整数数组 `nums`,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
个人思路:先把数组元素全部求平方再冒泡排序。有问题 超出时间限制
思路:数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。所以可以用双指针来做!!!
left和right分别指向数组的左右两端,对比。while(left<=right)用left指向的平方和right指向的平方对比如果left大了,left++,否则right++。