• 【算法】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 小结

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

  • 相关阅读:
    团队里A和B吵架了,经理M该干啥?
    一个程序员的哲学思考(关于编程、关于人生)
    程序员在大学里究竟应该学习什么?
    如何检查自己是否平庸?
    关于如何读代码?
    老说技术更迭快,可十年到底可以淘汰多少知识?
    现代软件工程里的困惑
    略谈各国企业的差异
    Silverlight4Beta之操作摄像头/麦克风
    Silverlight4Beta之Binding新特性(下)
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9841444.html
Copyright © 2020-2023  润新知