1.位1的个数
题目描述:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
class Solution {
public:
int hammingWeight(uint32_t n) {
int count = 0;
while(n){
if(n&1) count++;
n >>=1;
}
return count;
}
};
2.旋转数组
题目描述:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if( k == 0) return ;
k %= nums.size();
int p = nums.size();
nums.insert(nums.begin(),nums.end()-k,nums.end());
nums.resize(p);
}
};
3.课程表
参考https://chenzhuo.blog.csdn.net/article/details/91127897
题目描述:
现在你总共有 n 门课需要选,记为 0 到 n-1。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?
示例 1:
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
示例 2:
输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<int> flag(numCourses,0);
vector<vector<int>> tmp(numCourses);
if(prerequisites.size() == 0) return true;
for(int i = 0;i<prerequisites.size();++i) tmp[prerequisites[i][0]].push_back(prerequisites[i][1]);
bool ans = true;
for(int i = 0;i<numCourses;++i) ans = ans&&dfs(i,flag,tmp);
return ans;
}
bool dfs(int i,vector<int>& flag,vector<vector<int>>& tmp){
if(flag[i] == -1) return false;
if(flag[i] == 1) return true;
flag[i] = -1;
for(int j = 0;j<tmp[i].size();++j){
if(dfs(tmp[i][j],flag,tmp)) continue;
return false;
}
flag[i] = 1;
return true;
}
};