【数组元素处理(双指针)】

题目:

        有一个数组 int arr[n],要求写一个函数:void func(int *p, int n);将数组 arr 中为 0 的元素都移至数组末尾,将非 0 的元素移至开始(保持原来的顺序不变)。
例如:
数组中元素原来是:1 0 3 4 0 -3 5
经过 func 处理后:1 3 4 -3 5 0 0
输入:

 键盘输入6个整数,保存到数组中

返回值:

经过func处理后数组的元素,元素和元素之间使用空格隔开

例如:1 3 4 -3 5 0 0

 示例1

输入

1 0 3 4 0 -3

返回值

1 3 4 -3 0 0

题意整理:

1.给定一个数组。

2.将数组中所有0元素移到末尾,非0元素移到开头,同时保持非0元素相对位置不变。

解题思路(双指针)

1.定义两个指针id和i,id总是指向第一个0所在位置,i指向游标所在位置,遍历数组所有元素。

2.i指向元素不为0,则交换i、id位置的元素,同时id指针后移。

举例说明:

        对应数组[1,0,3,4,0,-3],id本来指向1,i指针开始也指向1,由于不等于0,交换i、id位置元素,由于在同一位置,所以数组相当于没有变化,id指针后移,此时id指向0,i指向0时,不作处理,i指向3时,交换i、id位置元素,数组变为[1,3,0,4,0,-3],同时id后移一位,仍然指向0,i指针继续遍历数组中的元素,作类似的处理,这样就会一步步将0移到数组末尾,同时,其它元素相对位置不变。

代码实现:

#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {

    //id指向第一个0所在位置
    int id=0;
    //i指向游标所在位置,遍历数组所有元素
    for(int i=0;i<n;i++){
        if(p[i]!=0){
            int temp=p[i];
            p[i]=p[id];
            p[id++]=temp;
        }
    }


}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值