只出现一次的数字:?
给你一个非空整数数组?nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。?
?
class Solution {
public:
int singleNumber(vector<int>& nums) {
int j=0;
for(auto i:nums)
{
j^=i;
}
return j;
}
};
?这道题其实告诉你有两个重复出现的数,就在提示你用异或了,用0依次与其他数异或,最后出现两次的都被消掉了,最后剩下的数就是只出现一次的数。
只出现一次的数字 :
?给你一个整数数组 nums,除某个元素仅出现 一次外,其余每个元素都恰出现 三次。请你找出并
返回那个只出现了一次的元素。
?第一部分:因为每个数是32位,我们把每个数的每一位分别放进一个数组,去统计每一位所有出现1的次数。1<<i 的意思是为了探测每一位的1出现的次数。将那个值与(1<<i)进行“与”运算,只要那一位是1,条件为真,将代表这一位的个数的数组进行加1。反复遍历,直到所有都遍历完为止。
第二部分:看每一位是否是3*N+1还是3*N+1,因为3*N+1代表那个要找的数这一位是1,3*N代表0,然后我们再定义一个变量num=0,如果是3*N+1,则将num与(1<<i)进行“或”运算,知道遍历完所有的,num就是我们要找的数了。
记住探测某1位是0还是1,用“与”运算。使某1位变成1,用“或”运算。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int v[32] = {0};
for (auto val : nums) {
for (int i = 0; i < 32; i++) {
if (val & (1 << i)) {
v[i]++;
}
}
}
int num = 0;
for (int i = 0; i < 32; i++) {
if (v[i] % 3 == 1) {
num |= (1 << i);
}
}
return num;
}
};