114. 只出现一次的数字
难度:简单
收藏
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < 32; ++ i ) {
int cnt = 0;
for (auto x : nums) {
if (x >> i & 1) cnt ++;
}
if (cnt % 2) {
ans |= 1 << i;
}
}
return ans;
}
};
181. 只出现一次的数字 III
难度:中等
收藏
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
**进阶:**你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0]
输出:[-1,0]
示例 3:
输入:nums = [0,1]
输出:[1,0]
提示:
2 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
- 除两个只出现一次的整数外,
nums
中的其他数字都出现两次
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int sum=0;
for(int i=0;i<nums.size();i++)
sum^=nums[i];
int pos=0;
for(int i=0;i<32;i++)
if((sum>>i)&1){
pos=i;
break;
}
int s1=0,s2=0;
for(int i=0;i<nums.size();i++)
if ((nums[i]>>pos)&1)
s1 ^= nums[i];
else
s2 ^= nums[i];
return vector<int>{s1,s2};
}
};
171. 2 的幂
难度:简单
收藏
给你一个整数 n
,请你判断该整数是否是 2 的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2x
,则认为 n
是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
示例 2:
输入:n = 16
输出:true
解释:24 = 16
示例 3:
输入:n = 3
输出:false
示例 4:
输入:n = 4
输出:true
示例 5:
输入:n = 5
输出:false
提示:
-2^31 <= n <= 2^31 - 1
**进阶:**你能够不使用循环/递归解决此问题吗?
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n>0 and (n&-n)==n #尝试用二进制表示手算
115. 只出现一次的数字 II
难度:中等
收藏
给你一个整数数组 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
中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
**进阶:**你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int bit = 0; bit < 32; bit++) {
int counter = 0;
for (int i = 0; i < nums.size(); i++)
counter += (nums[i] >> bit) & 1;
ans += (counter % 3) << bit;
}
return ans;
}
};
66. 子集
难度:中等
收藏
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res=[]
n=len(nums)
for i in range(1<<n):
temp=[]
for j in range(n):
if i>>j&1:
temp.append(nums[j])
res.append(temp)
return res