文章目录
- 1、判定字符是否唯一
- 2、丢失的数字
- 3、两整数之和
- 4、只出现一次的数字 II
- 5、 消失的两个数字
1、判定字符是否唯一
class Solution {
public:
bool isUnique(string astr) {
int n=astr.size();
if(n>26)//鸽巢原理
return false;
int bitMap=0;
for(auto& e : astr)
{
int s=e-'a';
if((bitMap>>s)&1)
return false;
bitMap|=1<<s;
}
return true;
}
};
2、丢失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int ret=0;
for(auto& e : nums)
ret^=e;
for(int i=0;i<=n;i++)
ret^=i;
return ret;
}
};
3、两整数之和
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
class Solution {
public:
int getSum(int a, int b) {
while(b!=0)
{
int x=a^b;//无进位相加
unsigned y=(unsigned)(a&b)<<1;//需要进位的数
a=x;
b=y;
}
return a;
}
};
4、只出现一次的数字 II
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret=0;
int n=nums.size();
for(int i=0;i<=31;i++)
{
int sum=0;
for(auto& e : nums)
{
if((e>>i)&1)
sum++;
}
if(sum%3==1)
ret|=1<<i;
}
return ret;
}
};
5、 消失的两个数字
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?
以任意顺序返回这两个数字均可。
class Solution {
public:
vector<int> missingTwo(vector<int>& nums) {
int n=nums.size();
int ret=0;
//找出那两个数
for(auto& e : nums)
ret^=e;
for(int i=1;i<=n+2;i++)
ret^=i;
//找到最右边的1,进行分类
int diff=0;
while(1)
{
if(((ret>>diff)&1)==1)
break;
else
diff++;
}
//进行分离两个数
int a=0;
int b=0;
for(auto& e : nums)
{
if(((e>>diff)&1)==1)
b^=e;
else
a^=e;
}
for(int j=1;j<=n+2;j++)
{
if(((j>>diff)&1)==1)
b^=j;
else
a^=j;
}
return {a,b};
}
};