题目描述(简单难度)

将所有的 移动到末尾,并且保持其他数字的相对顺序不变。

解法一

我的第一反应是利用两个指针,一个指针指向开头,一个指针指向末尾非零元素,然后从开头指针遍历,如果遇到 0 就和末尾指向的元素相交换,末尾指针向前移动到非零元素。

这就保证末尾指针后边元素全部是 0,当首尾指针相遇的时候结束。

同样利用双指针,指针 i 用于遍历数组,指针 j 开始指向开头,保证它前边的所有元素都是非 0 元素。

当 指针遇到非零元素就和 j 指针指向的元素交换,j 指针然后后移。

0,1,0,3,12 为例模拟一下过程。

  1. public void moveZeroes(int[] nums) {
  2. int j = 0;
  3. if (nums[i] != 0) {
  4. int temp = nums[j];
  5. nums[j] = nums[i];
  6. j++;
  7. }
  8. }

比较简单的一道题,双指针经常用到。用一个指针用来分割元素,使得它前边都是符合某种条件的元素。在快速排序中,也有用到这个思想。

添加好友一起进步~

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 查看详情