力扣剑指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号
浙公网安备 33010602011771号