链接:leetCode 27. 移除元素
题目内容:
给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。 - 返回
k。
示例 1:
输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2,_,_]
解释: 你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
示例 2:
输入: nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,4,0,3,_,_,_]
解释: 你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
解法:
看了灵茶山艾府的解法
-
正解: 1.初始化要填入的下标 k=0
2.从左到右遍历 nums,如果 nums[i] != val 时,nums不进行赋值同时k不进行自增
3.返回k+1
func removeElement(nums []int, val int) int {
k := 0
for _, x := range nums {
if x != val {
nums[k] = x
k++
}
}
return k
}
-
刚开始做题的我的若至解法:
1.遍历数组,将nums[i] == val 全部修改为 某个值,并统计变化值个数count
2.遍历1数组,不断交换nums[i] == 某个值 的num[i] 和num[length-count2-1]的值
3.返回length - count
func removeElement(nums []int, val int) int {
count := 0
length := len(nums)
for i := 0; i < length; i++ {
if nums[i] == val {
nums[i] = 7656
count++
}
}
count2 := 0
for i := 0; i < length; i++ {
if i == length-count2-1 {
break
}
if nums[i] == 7656 {
nums[i] = nums[length-count2-1]
nums[length-count2-1] = 7656
count2++
i--
}
}
res := length - count
return res
}
总结:
- 好消息:这是我做出来的第二道算法,且思想还是对的
- 坏消息:看起来巨蠢,尤其是看到了解法以后,感觉自己脑子可能有点问题……