本文介绍: 我们这里可以运用**“双指针”**的方法这里双指针,并不是 c 语言中的指针,而是用数组模拟指针看到题目,首先看一下题干的要求,是在原数组内进行操作,平切保持非零元素相对顺序遇到非零元素swap(dest+1,cur);首先先看题干,把数组每个零都复写一遍,其他元素水平右移,并且就地修改这个时候数组就被 curdest 分成了三个区间dest:已处理区间内,在非零元素最后一个位置我们定义两个“指针”,curdest。[ dest+1, cur-1 ] 0元素

283. 移动

在这里插入图片描述
原题链接

看到题目,首先看一下题干的要求,是在原数组内进行操作,平切保持非零元素相对顺序

这个时候我们看到示例一:
[ 0, 1, 0, 3,12 ]
这个时候输出成为
[ 1, 3, 12, 0, 0 ]

我们这里可以运用**“双指针”**的方法这里双指针,并不是 c 语言中的指针,而是用数组模拟的指针

首先:
我们要定义两个“指针”,curdest
cur:从左往右扫描数组遍历数组
dest:已处理区间内,在非零元素的最后一个位置

这个时候数组就被 curdest 分成了三个区间
[ 0, dest ] 存放非零元素
[ dest+1, cur-1 ] 0元素
[ cur, n-1 ] 未处理的元素

然后
cur 从前往后遍历
遇到 0 元素:cur++
遇到非零元素:swap(dest+1,cur); dest++; cur++;

public void moveZeroes(int[] nums) {
        int cur = 0;
        int dest = -1;
        for (; cur < nums.length; cur++) {
            if (nums[cur] != 0) {
                dest++;
                int tmp = nums[cur];
                nums[cur] = nums[dest];
                nums[dest] = tmp;
            }
        }
    }

在这里插入图片描述

1089. 复写零

在这里插入图片描述
原题链接

首先先看题干,把数组每个零都复写一遍,其他元素水平右移,并且就地修改
这里我们需要用到双指针,从后往前进行复写

但是这里我们需要遍历一遍,找到要复写的数字

方法

  1. 定义cur 和 dest
    cur:遍历数组
    dest:目标位置
  2. 先用双指找到要复写的数字
    遇到 0,dest += 2;
    这里遇到复写两个0,但是最后一个0超出数组范围
    这个时候我们需要把数组最后一个位置置为0,dest 的位置-2,cur–
  3. 从后往前遍历
public void duplicateZeros(int[] arr) {
        int cur = 0;
        int dest = -1;
        int n = arr.length;
        //1、找到最后一个需要复写的数
        while (cur < n) {
            if (arr[cur] == 0) {
                dest += 2;
            }else {
                dest += 1;
            }
            if (dest &gt;= n-1) {
                break;
            }
            cur++;
        }
        //2、处理边界情况
        if (dest == n) {
            arr[n - 1] = 0;
            cur--;
            dest -= 2;
        }
        //3、从后向前完成复写操作
        while (cur &gt;= 0) {
            if(arr[cur] != 0) {
                arr[dest--] = arr[cur--];
            }else {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }

在这里插入图片描述

原文地址:https://blog.csdn.net/WR1207/article/details/134675990

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39672.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注