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