1、只出现一次的数字I
1.1、题目信息
https://leetcode.cn/problems/single-number/description/
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [ 2 , 2 , 1 ]
输出:1
1.2、解题:
int singleNumber ( vector< int > & nums)
{
int res = nums[ 0 ] ;
for ( int i = 1 ; i < nums. size ( ) ; i++ )
{
res ^= nums[ i] ;
}
return res;
}
2、只出现一次的数字II
2.1、题目信息:
https://leetcode.cn/problems/WGki4K/description/
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1 :
输入:nums = [ 2 , 2 , 3 , 2 ]
输出:3
示例 2 :
输入:nums = [ 0 , 1 , 0 , 1 , 0 , 1 , 100 ]
输出:100
2.2、解题思路:
将整数转换成二进制,相同的数字出现三次,那二进制形式下,位数也会出现三次,通过与3相除取余数,求得只出现一次的元素
例子:{ 2 , 2 , 3 , 2 }
全部转成二进制形式:
0010
0010
0011
0010
-> 将所有二进制位数相加得到 0041
-> 将位数除于3 得到余数: 0011 -> 转成十进制就是3
代码实现
int singleNumber ( vector< int > & nums)
{
int bits[ 32 ] = { 0 } ;
int res = 0 ;
for ( int i = 0 ; i < nums. size ( ) ; i++ )
{
int num = nums[ i] ;
for ( int j = 0 ; j < 32 ; j++ )
{
bits[ 32 - j - 1 ] += ( num >> j) & 1 ;
}
}
for ( int i = 0 ; i < 32 ; i++ )
{
int bitNum = bits[ 32 - i - 1 ] % 3 * ( 1 << i) ;
res += bitNum;
}
return res;
}
3、总结
异或位运算操作,数字自己异或自己的结果为0 C++数组默认元素为随机值,要设置默认值全部为元素0的操作:int arr[32] = {0} 求整数二进制的位数,将元素不断右移与1进行与位运算,结果为1则位数为1