27 Remove Element

题目链接:https://leetcode.com/problems/remove-element/

题目:

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

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

解题思路:

1. i 指针从前向后扫描,遇到值为 val 的位置停下;j 指针从后向前扫描,遇到值为非 val 的位置停下。
2. 交换 i 和 j 位置的元素值。(可以不用交换直接覆盖)
3. 如果 i == j,则判断 i 当前位置的元素值是否为 val,若不为val,说明 i 扫描到了数组的末尾,且 i
之前(包括i)的元素都是有效元素,则长度为 i + 1。
4. 其余情况,i 值即为数组长度。

注意:
有几种特别的输入样例:
[3, 3] 3
[3, 3] 1
需要特别考虑!

nums[i] = nums[j];
j --;

要比

nums[i] = nums[j --];

节省时间得多!

交换元素的方法:

public class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums == null || nums.length == 0)
            return 0;
        int len = nums.length;
        if(len == 1) {
            if(nums[0] == val)
                return 0;
            else
                return 1;
        }
        int i = 0;
        int j = len - 1;
        while(i < j) {
            while(nums[i] != val && i < j)
                i ++;
            while(nums[j] == val && i < j)
                j --;
            if(nums[i] == val && nums[j] != val) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
            if(nums[i] != val && i == j) {
                i ++;
                break;
            }
        }
        return i;
    }
}
112 / 112 test cases passed.
Status: Accepted
Runtime: 300 ms

后来想到了可以用 j 位置的元素直接覆盖 i 位置的元素

public class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums == null || nums.length == 0)
            return 0;
        int len = nums.length;
        if(len == 1) {
            if(nums[0] == val)
                return 0;
            else
                return 1;
        }
        int i = 0;
        int j = len - 1;
        while(i < j) {
            while(nums[i] != val && i < j)
                i ++;
            while(nums[j] == val && i < j)
                j --;
            if(nums[i] == val && nums[j] != val) {
                nums[i] = nums[j];
                j --;
            }
            if(nums[i] != val && i == j) {
                i ++;
                break;
            }
        }
        return i;
    }
}
112 / 112 test cases passed.
Status: Accepted
Runtime: 268 ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值