剑指offer 数组中只出现一次的数字(C++)(加强对C语言指针的理解)

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路

  • 使用C++的count()函数,找到无重复的数字。
注意事项:
  1. 如果容器后序工作需要push_back()则前面初始化的时候不能直接开辟空间,如果执行vector<int> ivec(2)的话,导致执行push_back()后,数组前两个元素值为0。
  2. 加强对指针的理解,下文详细说。

代码实现

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        if(data.empty())
            return;
        int flag = 0;
        vector<int> ivec; // 不要提前开辟空间 否则存进去了两个0
        for(int i = 0; i < data.size(); i++)
        {
            if((flag = count(data.begin(), data.end(), data[i])) == 1)
                ivec.push_back(data[i]);
        }
        if(ivec.empty())
            return;
        *num1 = ivec[0];// 对指针所指向的内容进行修改
        *num2 = ivec[1];
        return;
    }
};

关于C语言指针

  1. 指针的本质就是存储着变量的地址,通过调用指针来对变量中的内容进行间接修改。
int a = 10;
int *p = &a;
*p = 12;
cout << a << endl; // a = 12;
  1. 写一下交换函数:
void swapTwoNum(int *num1, int *num2)
{
	int temp = 0;
	temp = *num1;
	*num1 = *num2;
	*num2 = temp;
}
int main()
{
	int num1 = 10, num2 = 20;
	swapTwoNum(&num1, &num2);
	cout << "num1 = " num1 << ", num2 = " << num2 << endl; // num1 = 20, num2 = 10
}

swapTwoNum()函数中的参数列表是变量的地址。程序执行时,swapTwoNum()会对num1和num2的地址进行复制,传入到交换函数中,执行地址所指向的变量值的两两交换。函数执行结束后,复制过来的这两个变量的地址会被释放掉,但主函数中的变量值却被永久的修改了,这就是指针的作用。

  1. 关于二级指针的理解:

首先给出一错误写法:
(代码1)

void assignPointer(int *num)
{
	int a = 10;
	num = &a;
}

int main()
{
	int *num = NULL;
	assignPointer(num);
	cout << *num << endl;
}

对上述代码的理解是:主函数中声明了一个指向空的整型指针,作为参数传入到被调用函数中,并将其指向被调用函数中的变量,最后在主函数中读取被调用函数中的变量。。。。这是错误的写法,程序直接报错。要想达到这个目的,看下面的正确写法:
(代码2)

void assignPointer(int **num)
{
	int a = 10;
	*num = &a;
}

int main()
{
	int *num = NULL;
	assignPointer(&num);
	cout << *num << endl;
}

代码1中,将指针作为函数参数传入被调用函数后,使用的是指针的副本,指针的副本指向了被调用函数中的变量的地址,待被调用函数结束后,主函数中指针的副本被释放,完全没有对主函数中的指针的指向造成任何影响。

代码2中, 将指针的指针(2级指针)作为参数传入被调用函数中,被调用函数复制的是实参的地址,也就是主函数中指针变量的地址,通过指针变量的地址来间接的对主函数中指针的指向进行修改,就会达到我们想要的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值