力扣剑指Offer(八)
1、打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
- 用返回一个整数列表来代替打印
- n 为正整数
考虑大数问题,不能直接暴力解,应该用字符串+dfs全排列的方法
class Solution {
private:
vector<int> ans;
int pos = 0;
public:
vector<int> printNumbers(int n) {
string str = "0123456789";
string s = "";
dfs(str, s, n);
return ans;
}
void dfs(string &str, string &s, int n){
if(s.length() == n) {
if(pos == 0) {
pos = 1;
return;
}
ans.push_back(atoi(s.c_str()));
return;
}
for(int i = 0; i < str.length(); i++) {
s+=str[i];
dfs(str, s, n);
s.pop_back();
}
}
};
2、二进制中1的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 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 res=0;
for(int i=0;i<32;i++){
if(n&(1<<i))
res++;
}
return res;
}
};
方法二:位运算优化 n&(n-1) 其预算结果恰为把 n*n 的二进制位中的最低位的1变为0之后的结果。
class Solution {
public:
int hammingWeight(uint32_t n) {
int res=0;
while(n){
n&=(n-1);
res++;
}
return res;
}
};

浙公网安备 33010602011771号