leetcode初级之杂项

1. 位1的个数

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数

  • 例:
    输入:00000000000000000000000000001011
    输出:3
    解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

解题思路:数字右移,然后每次判断最小的那位是不是1即可,判断思路是与0x1做与运算,什么时候结束循环呢?当原始数右移后,等于零时,表示此数所有位上都没有1,此时可跳出循环。

 int hammingWeight(uint32_t n) {
        int rs = 0;
        while(n){
            rs+=n&0x1u;
            n>>=1;
        }

        return rs;
    }

2. 汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 xy,计算它们之间的汉明距离。
注意:0 ≤ x, y < 231

解题思路:两个数做异或操作,当二进制位不同时表示为1,二进制相同时表示为0,所以只需要将两个数做异或操作,然后判断结果中1的个数即可。

 int hammingDistance(int x, int y) {
        int n = x^y;
        int count=0;
        while(n){
            if(n&0x1)
                ++count;
            n>>=1;
        }
        return count;
    }

3. 颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位
如果多次调用这个函数,你将如何优化你的算法?

解题思路:将结果数左移,将原数二进制的最后一位取出,加入到结果数的末尾,原数右移。思路相当于链表倒置的头插法。

uint32_t reverseBits(uint32_t n) {
    uint32_t rs = 0;
    for(int i = 0;i<32;++i){
        rs<<=1;
        rs|=(n&0x1u); 
         n>>=1;
    }
    return rs;
}

4. 帕斯卡三角形

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。


解题思路:主要有以下几条性质:
1.下一行比前一行多1个数
2.每一行最前和最后的元素都是1
3.每一行都是对称的
所以我们计算时一次计算的值还可以放到与当前值中心对称的那个位置上,一次类推,直至计算到中心点。

vector> generate(int numRows) {
        vector> rs;
        if(0>=numRows) return rs;
        rs.resize(numRows);
        rs[0].push_back(1);
        for(int i=1;i

5. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

解题思路:当遇到括号的左半边时,用stack记录此括号需要的右半边,当遇到括号的右半边时,对比栈顶与当前值是否相等,继续执行后,判断栈内是否有还没有匹配的括号,如果都没有证明所有的括号都正常匹配。

   bool isValid(string s) {
        stack st;
        for(int i=0;i

6. 缺失数字

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

解题思路:与我文章中Leetcode初级之数组篇
第5题出现一次的数字,异曲同工,这里就不再赘述了。

int missingNumber(vector& nums) {
        int r = 0;
        for(int i =0;i< nums.size();i++)
        {
            r^=nums[i];
            r^=i;
        }
        return r^nums.size();
    }

你可能感兴趣的:(leetcode初级之杂项)