目录
两整数之和(medium)
题目解析
1.题目链接:. - 力扣(LeetCode)
2.题目描述
给你两个整数a和b,不使⽤运算符+和-,计算并返回两整数之和。
⽰例1:
输⼊:a=1,b=2
输出:3
⽰例2:
输⼊:a=2,b=3
输出:5
提⽰:
-1000<=a,b<=1000
讲解算法原理
解法(位运算):
算法思路:
◦ 异或 ^ 运算本质是「⽆进位加法」;
◦ 按位与 & 操作能够得到「进位」;
◦ 然后⼀直循环进⾏,直到「进位」变成 0 为⽌。
编写代码
c++算法代码:
class Solution
{
public:
int getSum(int a, int b)
{
while(b != 0)
{
int x = a ^ b; // 先算出⽆进位相加的结果
unsigned int carry = (unsigned int)(a & b) << 1; // 算出进位 a = x;
b = carry;
}
return a;
}
};
java算法代码:
class Solution {
public int getSum(int a, int b) {
while(b != 0)
{
int x = a ^ b; // 先算出⽆进位相加的结果 int carry = (a & b) << 1; // 计算进位 a = x;
b = carry;
}
return a;
}
}
只出现⼀次的数字II(medium)
题目解析
1.题目链接:. - 力扣(LeetCode)
2.题目描述
给你⼀个整数数组nums,除某个元素仅出现⼀次外,其余每个元素都恰出现三次。请你找出并返回那个只出现了⼀次的元素。
你必须设计并实现线性时间复杂度的算法且不使⽤额外空间来解决此问题。
⽰例1:
输⼊:nums=[2,2,3,2]
输出:3
⽰例2:
输⼊:nums=[0,1,0,1,0,1,99]
输出:99
提⽰:
1<=nums.length<=3*104
-231<=nums[i]<=231-1
nums中,除某个元素仅出现⼀次外,其余每个元素都恰出现三次
讲解算法原理
解法(⽐特位计数):
算法思路:
设要找的数位 ret 。
由于整个数组中,需要找的元素只出现了「⼀次」,其余的数都出现的「三次」,因此我们可以根据所有数的「某⼀个⽐特位」的总和 %3 的结果,快速定位到 ret 的「⼀个⽐特位上」的值是0 还是 1 。
这样,我们通过 ret 的每⼀个⽐特位上的值,就可以将 ret 给还原出来。
编写代码
c++算法代码:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
int ret = 0;
for(int i = 0; i < 32; i++) // 依次去修改 ret 中的每⼀位 {
int sum = 0;
for(int x : nums) // 计算nums中所有的数的第 i 位的和 if(((x >> i) & 1) == 1)
sum++;
sum %= 3;
if(sum == 1) ret |= 1 << i;
}
return ret;
}
};
java算法代码:
class Solution
{
public int singleNumber(int[] nums)
{
int ret = 0;
for(int i = 0; i < 32; i++) // 依次修改 ret 中的每⼀个⽐特位 {
int sum = 0;
for(int x : nums) // 统计 nums 中所有的数的第 i 位的和 if(((x >> i) & 1) == 1)
sum++;
sum %= 3;
if(sum == 1) ret |= 1 << i;
}
return ret;
}
}