将数组中的0全部移动到末尾

题目:Move Zeroes

描述:

Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note:
1、You must do this in-place without making a copy of the array.
2、Minimize the total number of operations.

翻译:

将数组中的所有0移动到末尾,并保持非0元素的顺序不改变。
比如[0,1,0,3,12]移动后的期望数组为[1,3,12,0,0]

小要求:

1、不能创建一个新的数组来做操作
2、尽量少的操作次数

答案:

public void moveZeroes(int[] nums) {
        int size = nums.length;
        int startIndex = 0;
// 0元素开始的位置
        int endIndex = 0;
// 0元素结束的位置
        int currentNum;
        int i= 0;
        // 第一步:找到第一个0元素开始的位置
        // 并将第一个0元素的游标赋值给startIndex&endIndex
        while(i < size){
            currentNum = nums[i];
            if (currentNum == 0) {
                startIndex = i;
                endIndex = i;
                break;
            }
            ++i;
        }
        // 如果当前数组中没有找到0元素,则推出
        if (nums[endIndex] != 0)
            return;

        // 将当前i的值加1;直接从刚才0元素位置的后一位置开始循环
        ++i;
        while (i < size) {
            currentNum = nums[i];
            if (currentNum == 0){//如果当前元素等于0,则将i值赋值给endIndex
                    endIndex = i;
            } else {
                // 如果不为0
                //则将当前元素赋值给nums[startIndex]
                // 并将当前位置的元素赋值为0
                // startIndex和endIndex都加1;
                nums[startIndex] = currentNum;
                nums[i] = 0;
                ++startIndex;
                ++endIndex;
            }
            ++i;
        }
    }

算法解释

此算法的精髓在于:在循环遍历中将0元素全部集中起来,整体向后移位,但是由于连续的0元素都是相等的,因此就算往前移位,也只需要将最前面的0元素和连续0元素的结束位置的后一位元素进行调换,相当于整个0元素块都向后移动了一位。
由于数组中可能有多个0,因此,第一次循环的时候,就将第一个0元素找出,并且记录当前0元素的游标(此时0元素开始的游标和结束的游标相等),第二次循环的时候,直接从0元素结束的游标的后一位开始循环遍历,如果循环遍历过程中,遇到了0元素,则将0元素的结束游标+1;如果没有遇到0元素,则将0元素开始位置和当前位置的数进行置换,并且将0元素的开始游标和结束游标都+1。

### 回答1: 可以使用双指针的方法实现,一个指针指向当前需要交换的位置,另一个指针遍历数组遍历到非0元素时,将其与第一个指针指向的位置交换,并将第一个指针向后移动一位。这样遍历完整个数组后,所有的0都被移到末尾。 以下是示例代码: ```python def move_zeroes(nums): zero_idx = 0 # 第一个指针初始指向数组的第一个位置 for i in range(len(nums)): if nums[i] != 0: # 遇到非0元素时,和第一个指针指向的位置交换 nums[i], nums[zero_idx] = nums[zero_idx], nums[i] zero_idx += 1 # 第一个指针后移一位 ``` 例如,对于输入数组 `[0, 1, 0, 3, 12]`,经过函数 `move_zeroes()` 处理后,数组变为 `[1, 3, 12, 0, 0]`。 ### 回答2: Python中可以通过遍历数组移动0到末尾的方式实现题目要求。以下是一种简单的实现方法: 1. 首先定义两个指针,一个用于遍历数组元素,另一个指向最后一个非0元素的位置。 2. 使用一个循环,遍历数组中的每个元素。如果当前元素不为0,则将其与指向最后一个非0元素的指针位置进行交换,并将指针位置减1。 3. 循环结束后,所有非0元素都会移动数组的前半部分,而0元素移动到后半部分。 4. 最后,将数组中指针位置之后的元素全部置为0,完成整个移动过程。 下面是具体的代码实现: ```python def move_zeros(nums): n = len(nums) last_non_zero = n - 1 # 最后一个非0元素的指针位置 for i in range(n): if nums[i] != 0: nums[i], nums[last_non_zero] = nums[last_non_zero], nums[i] last_non_zero -= 1 # 将最后一个非0元素指针位置之后的元素置为0 for i in range(last_non_zero + 1, n): nums[i] = 0 # 示例测试 nums = [0, 1, 0, 3, 12] move_zeros(nums) print(nums) # 输出:[1, 3, 12, 0, 0] ``` 这样做的原理是通过双指针的方式,将非0元素往前移动,并将0元素往后移动,最终实现0元素移动数组末尾。 ### 回答3: 要实现将数组中的0移动到数据的末尾,而不影响其余非0数字的顺序,可以通过遍历数组的方式进行操作。具体步骤如下: 1. 定义两个指针i和j,初始时i和j都指向数组的第一个元素。 2. 使用一个循环遍历整个数组。在遍历过程中,如果当前数字不为0,则将该数字赋值给指针i所指向的位置,并将i指针向后移动一位;如果当前数字为0,则将指针j向后移动一位,直到指向一个非0数字。 3. 循环结束后,将指针i之后的所有位置都置为0,完成数组中0的移动操作。 以下是示例代码: ```python def move_zeros(nums): i = 0 j = 0 n = len(nums) while j < n: if nums[j] != 0: nums[i] = nums[j] i += 1 j += 1 while i < n: nums[i] = 0 i += 1 return nums ``` 通过以上算法,可以将数组中的所有0移动到数据末尾,而不改变其他非0数字的顺序。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值