题目链接

移动零

题目描述

image.png

实现代码

思路:由于题目要求不能复制数据,可以看成是要求常数级空间复杂度;

我们可以从前往后对数组进行遍历,给与一个标记step和一个索引标记needChange,如果遍历找到了0,则修改标记step,表示后面的遍历都需要前移,同时通过needChange记录前移的位置;在遍历完成之后还需要将所有0放入数组尾部,通过needChange进行判断遍历至数组尾部添加0即可;

实现代码如下:

  1. class Solution {
  2. public void moveZeroes(int[] nums) {
  3. int len = nums.length;
  4. if(len == 1) {
  5. return;
  6. }
  7. int step = 0;
  8. int needChange = -1;
  9. for(int i=0; ; ) {
  10. if(i>len-1) {
  11. break;
  12. }
  13. if(nums[i] == 0) {
  14. if(needChange == -1) {
  15. needChange = i;
  16. }
  17. step++;
  18. i++;
  19. continue;
  20. }
  21. if(step != 0) {
  22. nums[needChange] = nums[i];
  23. needChange++;
  24. i++;
  25. continue;
  26. }
  27. i++;
  28. }
  29. if(needChange != -1) {
  30. for (; needChange < len; needChange++) {
  31. nums[needChange] = 0;
  32. }
  33. }
  34. return;
  35. }
  36. }