【力扣】283“交换0” 中 以指针为参数的交换函数

文章讲述了在解决力扣第283题时,使用双指针策略遇到的问题。初始的swap函数由于未创建新变量导致数值交换失败。通过分析错误,作者修改了swap函数,创建了一个临时变量t进行正确的数值交换,从而解决了问题。
摘要由CSDN通过智能技术生成

【力扣】283“交换0” 中 以指针为参数的交换函数

题源链接
今天在刷力扣第283题的时候遇到了一些问题,题目如下:
在这里插入图片描述

这一题我采用的是双指针来完成的,使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。

void swap(int* a,int* b){
    int* t = a;
    *a = *b;
    *b = *t;
}


void moveZeroes(int* nums, int numsSize){
    int left = 0;
    int right = 0;
    for(;right < numsSize;right++){
        if(nums[right]){
            swap(nums + left,nums + right);
            left++;
        }
    }
}

但是运行的部分测试集没有通过
在这里插入图片描述
在检查过后怀疑是代码中用于交换数字的swap()函数写错了。
接下来测试一下

void swap(int* a,int* b){
    int* t = a;
    *a = *b;
    *b = *t;
}

#include <stdio.h>
int main()
{
    int a = 99;
    int b = 66;
    int* ptr_a = &a;
    int* ptr_b = &b;
    printf("%d\n", a);
    printf("%d\n", b);
    swap(ptr_a, ptr_b);
    printf("%d\n", *ptr_a);
    printf("%d\n", *ptr_b);
    
    return 0;
}

运行结果
在这里插入图片描述

可以看到a,b的值经过swap()执行后输出的结果是66 66,说明并没有实现交换
接下来分析错误原因
在这里插入图片描述
可以看到赋值操作int* t = a; 意味着t 和 a指向了同一个地址,而不是创建了t的副本,这样交换没有实际意义,因为a和b的值都被赋值为t(也就是原来a的值),而不是实现了交换。
为了解决这个问题,可以修改swap()为:

void swap(int* a,int* b){
    int t = *a;
    *a = *b;
    *b = t;
}

这样int t = a;将会创造一个新的整型变量t,将a的值赋给它,然后依次完成交换在这里插入图片描述

成功改正!

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值