题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解题思路
- 使用C++的
count()
函数,找到无重复的数字。
注意事项:
- 如果容器后序工作需要
push_back()
则前面初始化的时候不能直接开辟空间,如果执行vector<int> ivec(2)
的话,导致执行push_back()
后,数组前两个元素值为0。 - 加强对指针的理解,下文详细说。
代码实现
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语言指针
- 指针的本质就是存储着变量的地址,通过调用指针来对变量中的内容进行间接修改。
int a = 10;
int *p = &a;
*p = 12;
cout << a << endl; // a = 12;
- 写一下交换函数:
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)
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级指针)作为参数传入被调用函数中,被调用函数复制的是实参的地址,也就是主函数中指针变量的地址,通过指针变量的地址来间接的对主函数中指针的指向进行修改,就会达到我们想要的结果。