【算法】LeetCode算法题-Remove Element

这是悦乐书的第150次更新,第152篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第9题(顺位题号是27)。给定整数数组nums和值val,删除nums中所有的val值,元素顺序可以改变,返回删除val值后数组的长度。不能使用新数组接收数据。例如:

给定数组nums = {3,2,2,3}, val = 3
你的函数应返回length = 2
其中nums的前两个元素为2

给定数组nums = [0,1,2,2,3,0,4,2],val = 2
你的函数应该返回length = 5
其中nums的前五个元素包含0,1,3,0和4

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

顺位比较并替换重复值。获取第i个元素,与val比较是否相等,如果相等,则判断val在此是否为连续出现,并使用j来记录索引,直到val不再连续出现的时候,将val第一次出现的值与索引j所代表的值进行互换,依次往后循环。内层嵌套了while循环,但是并不会每次都循环n-1次,其内部也有终止语句。

public int removeElement(int[] nums, int val) {
    if (nums.length == 0) {
        return 0;
    }
    int count = 0;
    int j = 0;
    for (int i=0; i<nums.length;i++) {
        if (nums[i] == val) {
            j = i;
            while (nums[j] == val) {
                j++;
                if(j == nums.length){
                    return count;
                }
            }
            nums[i] = nums[j];
            nums[j] = val;
        }
        count++;
    }
    return count;
}

03 第二种解法

从索引0开始重新设值。定义初始条件count=-1,获取第i位元素与val比较,如果不相等,则nums[++count] = nums[i],此处使用前加加,直接将重复元素用后面的值替换点,而不是像第一种方法那样交换值。如果不习惯看前加加,还有后加加的写法。原则就是count会自然从0往后增加,第i位元素如果等于val,会继续循环,直到不等于,而count处于等待状态,等待非重复元素继续设值。

public int removeElement2(int[] nums , int val) {
    int count = -1; 
    if(nums.length ==1 && nums[0]!=val)
        return 1;

    for ( int n : nums){
        if (n != val && count <= nums.length-2) {
            nums[++count] = n;
        }
    }
    return count+1;
}

// 后加加的写法
public int removeElement3(int[] nums , int val) {
    int count = 0; 
    if(nums.length ==1 && nums[0]!=val){
        return 1;
    }
    for (int i=0; i<nums.length; i++) {
        if (nums[i] != val && count <= nums.length-1) {
            nums[count++] = nums[i];
        }
    }
    return count;
}

04 小结

此题比较简单,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

posted @ 2018-10-24 08:23  程序员小川  阅读(247)  评论(0编辑  收藏  举报