問題
給定一個數(shù)組,在原數(shù)組上(在原數(shù)組上操作称龙,不能使用新數(shù)組)將非0值向前移動没卸,零值向后移動,并保證非零值在操作后與原數(shù)組上的順序一致沪停。
思路
1)通過游標(biāo)記錄當(dāng)前位置
2)遍歷數(shù)組元素煤辨,如果當(dāng)前元素不等于零,則將當(dāng)前元素值賦值給當(dāng)前游標(biāo)值,且游標(biāo)值自增掷酗。(將非零值整體向前移動,暫不考慮零值)
3)通過游標(biāo)值記錄的當(dāng)前位置窟哺,將其后面的值都置為零泻轰。
image.png
實現(xiàn)
/**
* 給定一個數(shù)組,將非0值向前移動且轨, 0值向后移動浮声, 且必須要在原數(shù)組上操作,并保證非0值的原樣順序
*/
public class MoveZeroes {
public static void main(String[] args) {
int[] nums = new int[]{0,3,0,1,12};
nums = moveZeroes(nums);
System.out.println(Arrays.toString(nums));
}
private static int[] moveZeroes(int[] nums) {
/**
* 設(shè)置游標(biāo)index旋奢,用于記錄操作到了哪里
* 如果數(shù)組中遍歷得到的值不為0泳挥,則將該值給到游標(biāo)位,游標(biāo)值自增至朗,并繼續(xù)向后遍歷(將所有非0值向前移動)
* 將index后面的值都變?yōu)?
* [0,0,0,0,1,0,0]
* index=0 i=0
* index=0 i=1
* index=0 i=2
* index=0 i=3
* index=1 i=4 [1,0,0,0,1,0,0]
* index=1 i=5
* index=1 i=6
*如果1<length 將后面的置為0
*/
int index = 0;
for(int i=0;i<nums.length;i++){
if (nums[i] != 0){
nums[index] = nums[i];
index++;
}
}
while (index < nums.length){
nums[index] = 0;
index++;
}
return nums;
}
}
image.png