解题思路
说实话,不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数组,这句没看懂。
第一次理解:应该是不能开辟新的数组来存储target = val的数,再看示例,可以用一个计数来实现。
第二次看随想录解析:
确实是返回新的数组大小,然后它内部会看你的数组有没有删掉或者处理,所以会显示输出你的数组长啥样,所以不能讨巧。
重点在于数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
所以方法就是用双指针,一个用来找,一个用来覆盖。
出现的问题
完全搞不懂到底要输出什么,返回的是不等于val的值,但是看它预计输出是处理好的nums数组。
写的代码如下:
function compare(a, b){
return b-a
}
var removeElement = function(nums, val) {
let total = 0
for(let i=0; i<nums.length; i++){
if(nums[i] === val){
total += 1
nums[i] = 0
}
}
nums = nums.sort(compare)
console.log(total)
return total
};
JavaScript解法代码
var removeElement = function(nums, val) {
let slow=0,fast=0
while(fast < nums.length){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
fast++
}
return slow
};
Python解法代码
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
slow = 0
fast = 0
while(fast < len(nums)):
if(nums[fast] != val):
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
总结:
- 好久没用
sort()了,回顾总结下
function compare(a, b){
return b-a
}
Array.sort(compare)
a,b表示数组中的任意两个元素,
- 若return > 0,b前a后,a-b输出从小到大排序;
- 若reutrn < 0,a前b后,b-a输出从大到小排序。
-
slow++和++slow这个也回顾下:
-
slow++是运算完再+1 -
++slow是+1完再运算
python 没有