Leetcode - Remove Element

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:

這次作業(yè)感覺(jué)有點(diǎn)問(wèn)題,他說(shuō)是讓我返回新數(shù)組的長(zhǎng)度,那么我就直接遍歷數(shù)組,統(tǒng)計(jì)出不同數(shù)字的個(gè)數(shù),返回,不就行了嗎?結(jié)果報(bào)錯(cuò)。
然后我又新建一個(gè)數(shù)組,把不同的數(shù)字放進(jìn)去,再讓nums用這個(gè)引用。結(jié)果還是報(bào)錯(cuò)。
按了下做法,只能在原數(shù)組進(jìn)行操作,那你說(shuō)清楚啊。
只不過(guò)這個(gè)做法還是相當(dāng)巧妙的。這道題沒(méi)做完,中途聽(tīng)了兩個(gè)多小時(shí),所以回來(lái)做思路已經(jīng)跟不上了。

補(bǔ):剛我想了下,為什么一定要按照這個(gè)辦法做呢?這個(gè)辦法坐下來(lái),尾巴部分也會(huì)有很多val的,清理的不干凈。但想了下又覺(jué)得很對(duì),為什么,因?yàn)樗祷亓薾ew length 啊。然后數(shù)組是引用,也被修改了。那么之后就可以。

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

**
總結(jié):Array
今天是爺爺忌日,沒(méi)想到一晃9年過(guò)去了。那個(gè)時(shí)候的我怎么樣,現(xiàn)在的我又怎么樣。

**

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;
    }
}

首先這道題目的前提是, 順序可改變。
那么最上面的做法存在問(wèn)題。
如果,整個(gè)數(shù)組中只存在幾個(gè)他要求刪除的value,而且這幾個(gè)value就在最前面,那么他每次遍歷一個(gè)元素的時(shí)候,都需要重新賦下值。效率不高。
如果采用現(xiàn)在這種做法,那么很多數(shù)都不用去動(dòng)。真正的內(nèi)存寫操作會(huì)很少。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容