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:
這次作業感覺有點問題,他說是讓我返回新數組的長度,那么我就直接遍歷數組,統計出不同數字的個數,返回,不就行了嗎?結果報錯。
然后我又新建一個數組,把不同的數字放進去,再讓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