Leetcode - Remove Element

Leetcode - Remove Element_第1张图片

My code:

public class Solution {
    public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0)
            return 0;
        int del = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == val)
                del++;
            else
                nums[i - del] = nums[i];
        }
        return nums.length - del;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] nums = {4, 5};
        System.out.println(test.removeElement(nums, 4));
        
    }
}

My test result:

Leetcode - Remove Element_第2张图片

这次作业感觉有点问题,他说是让我返回新数组的长度,那么我就直接遍历数组,统计出不同数字的个数,返回,不就行了吗?结果报错。
然后我又新建一个数组,把不同的数字放进去,再让nums用这个引用。结果还是报错。
按了下做法,只能在原数组进行操作,那你说清楚啊。
只不过这个做法还是相当巧妙的。这道题没做完,中途听了两个多小时,所以回来做思路已经跟不上了。

补:刚我想了下,为什么一定要按照这个办法做呢?这个办法坐下来,尾巴部分也会有很多val的,清理的不干净。但想了下又觉得很对,为什么,因为他返回了new length 啊。然后数组是引用,也被修改了。那么之后就可以。

for (int i = 0; i < removeElement(nums, 4); i++) {
          // other operations
}

**
总结:Array
今天是爷爷忌日,没想到一晃9年过去了。那个时候的我怎么样,现在的我又怎么样。

**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0)
            return 0;
        int del = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == val)
                del++;
            else 
                nums[i - del] = nums[i];
        }
        return nums.length - del;
    }
}

基本差不多。

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0)
            return 0;
       int i = 0;
       int j = nums.length - 1;
       while (i <= j) {
           while (i < nums.length - 1 && nums[i] != val) {
               i++;
           }
           while (j >= 0 && nums[j] == val) {
               j--;
           }
           if (i <= j) {
               int temp = nums[i];
               nums[i] = nums[j];
               nums[j] = temp;
               i++;
               j--;
           }
       }
       
       return i;
    }
}

首先这道题目的前提是, 顺序可改变。
那么最上面的做法存在问题。
如果,整个数组中只存在几个他要求删除的value,而且这几个value就在最前面,那么他每次遍历一个元素的时候,都需要重新赋下值。效率不高。
如果采用现在这种做法,那么很多数都不用去动。真正的内存写操作会很少。

Anyway, Good luck, Richardo! -- 09/12/2016

你可能感兴趣的:(Leetcode - Remove Element)