LeetcCode 27:移除元素 Remove Element(python、java)

公众号:爱写bugjava

给定一个数组 nums 和一个值 val,你须要原地移除全部数值等于 val 的元素,返回移除后数组的新长度。python

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。数组

元素的顺序能够改变。你不须要考虑数组中超出新长度后面的元素。函数

Given an array nums and a value val, remove all instances of that value in-place and return the new length.this

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.spa

The order of elements can be changed. It doesn't matter what you leave beyond the new length.指针

示例 1:code

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 而且 nums 中的前两个元素均为 2。

你不须要考虑数组中超出新长度后面的元素。

示例 2:索引

给定 nums = [0,1,2,2,3,0,4,2], val = 2,

函数应该返回新的长度 5, 而且 nums 中的前五个元素为 0, 1, 3, 0, 4。

注意这五个元素可为任意顺序。

你不须要考虑数组中超出新长度后面的元素。

说明:ip

为何返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以**“引用”**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你能够想象内部操做以下:

Confused why the returned value is an integer but your answer is an array?

Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

Internally you can think of this:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的全部元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

解题思路:

​ 只容许原数组修改,能够用双指针,左指针 i 自左向右,右指针 j 从右向左。若是索引 i 和 val 相等,则索引 i 获得索引 j 的值,而且 j 前移一位。若是不相等,i 后移一位。

​ 由于要求是返回修改后的长度并只考虑该长度的数组,那么就不用考虑该长度以后的数组,因此只需获得索引 j 的值,不用再把索引 j 的值改成索引 i的值。

Java:

class Solution {
    public int removeElement(int[] nums, int val) {
        int i=0,j=nums.length-1;//i-左指针;j-右指针
        while (i<=j){
            if(nums[i]==val){
                nums[i]=nums[j];//获得索引j的值,无需把索引j的值改成索引i的值
                j--;
            }else i++;
        }
        return j+1;
    }
}

Python3:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i=0
        j=len(nums)-1
        while i<=j:
            if(nums[i]==val):
                nums[i]=nums[j]
                j-=1
            else:i+=1
        return j+1

总结:

​ 这道题自己很简单,只要搞清思路,一块儿都会变得明了。

相关文章
相关标签/搜索