tag 線性表 數(shù)組 刪除指定數(shù)據(jù)
思想
- 假設(shè):val為指定值
- 使first和second首先指向第一個(gè)元素
- 如果
second != val,那么first和second同時(shí)前進(jìn),并且會(huì)進(jìn)行賦值 - 如果
second == val,那么second前進(jìn),而first則進(jìn)行等待,直到找到一個(gè)second != val的位置再次執(zhí)行1 - 重復(fù)1-2,直到second達(dá)到末尾
- first指向的位置就是刪除指定元素之后的數(shù)組
- 如果
代碼
public int removeElement(int[] nums, int val) {
if(nums == null || nums.length == 0)
return 0;
int j = 0;
//跳過(guò)相等的部分,不等的部分賦值
for(int i = 0; i < nums.length;i++){
if(nums[i] != val){
nums[j] = nums[i];
j++;
}
}
return j;
}
總結(jié)
- 特別注意的一點(diǎn)是
nums[j] = nums[i];的賦值位置,這個(gè)for改成while可能更好理解 - 總體思想是跳過(guò)指定元素,和刪除線性表中的重復(fù)數(shù)據(jù)-使用單鏈表實(shí)現(xiàn)的總體思想是一樣的
- 注意一點(diǎn)和刪除線性表中的重復(fù)數(shù)據(jù)-使用單鏈表實(shí)現(xiàn)的區(qū)別
- 為什么刪除重復(fù)數(shù)據(jù)first和second指向的不是同一個(gè)位置?
因?yàn)樾枰容^,而刪除指定數(shù)據(jù)是不需要再?gòu)臄?shù)組中拿出一個(gè)數(shù)據(jù)進(jìn)行比較的 - 在刪除指定數(shù)據(jù)和刪除重復(fù)數(shù)據(jù)中first起什么作用?
在刪除重復(fù)數(shù)據(jù)中,first不僅擔(dān)任著要記錄需要返回的不重復(fù)數(shù)據(jù)的個(gè)數(shù),而且還擔(dān)任著比較的任務(wù);但是在刪除指定數(shù)據(jù)中,first純粹只是個(gè)記錄變量,只要second不等于val,就要被強(qiáng)制賦值
- 為什么刪除重復(fù)數(shù)據(jù)first和second指向的不是同一個(gè)位置?