136.只出现一次的数字
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1] 输出:1
示例 2 :
输入:nums = [4,1,2,1,2] 输出:4
思路详解:还是用哈希表来解决,如果不理解可以去第二十四期查看哈希表的用法:
代码详解:
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> un_map;//创建哈希表
for(auto it:nums)//键值对存储
{
un_map[it]++;//将元素作为键,出现的次数作为值
}
int index=0;//用来记录键
for(auto it:un_map)//遍历哈希表
{
if(it.second==1)//second表示值,first表示键
{
index=it.first;
}
}
return index;//返回对应值即可
}
};
面经:
- 什么是c++的初始化参数列表?作用是什么?它和在构造函数体内赋值有什么区别呢?
- 初始化参数列表是用来初始化成员变量的
- 初始化参数列表只能在构造函数中使用,因为创建对象只调用了构造函数
- 初始化的顺序与初始化参数列表的顺序无关,与声明变量的顺序有关
- 常量和引用必须在初始化参数列表中初始化。
- 在继承中如果父类没有无参构造的时候,可以在子类初始化参数列表中调用父类构造函数,当成员变量是某个类的对象时可以在初始化参数列表在调用该成员变量的构造函数
使用方法:
#include<iostream>
using namespace std;
class A
{
int a;
int b;
int c;
public:
A(int a1, int b1):b(a),c(a1),a(b1)//先初始化a,在初始化b,最后初始化c
{
cout << a << " " << b << " " << c;
}
};
int main()
{
A (1,2);
return 0;
}
//运行结果:2 2 1
两者区别:
- 两者最本质的区别就是构造函数是给成员变量赋值的而初始化参数列表是给成员变量初始化的。
- 性能:对于非内置类型,初始化参数列表通常性能更好。
- 初始化顺序:初始化参数列表按照类中声明的顺序初始化,而构造函数体内的赋值操作按照代码顺序执行。
- 必须性:引用和常量成员变量必须使用初始化参数列表来初始化。
- 灵活性:构造函数体内的赋值提供了更高的灵活性,可以在运行时决定成员变量的值。