刷题笔记8-12 leetCode27. 移除元素

78 阅读2分钟

链接: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
}

总结:

  • 好消息:这是我做出来的第二道算法,且思想还是对的
  • 坏消息:看起来巨蠢,尤其是看到了解法以后,感觉自己脑子可能有点问题……