C++ Leetcode初级算法之其他篇

1.位1的个数

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

示例 :

输入: 11
输出: 3
解释: 整数 11 的二进制表示为 00000000000000000000000000001011

示例 2:

输入: 128
输出: 1
解释: 整数 128 的二进制表示为 00000000000000000000000010000000

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int count=0;
        while(n)
        {
            count++;
            n = n&(n-1);
        }
        return count;
    }
};

思路:任何数与比自己小1的数相与会去掉自己最后一位1

2.汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ x, y < 231.

示例:

输入: x = 1, y = 4

输出: 2

解释:

1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

上面的箭头指出了对应二进制位不同的位置。

class Solution {
public:
    int hammingDistance(int x, int y) {
        int z = x^y;
        int count=0;
        while(z)
        {
            count++;
            z = z&(z-1);
        }
        return count;
    }
};

思路:先将两数异或,再求出1的个数即可

3.颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。

示例:

输入: 43261596
输出: 964176192
解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 ,
返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
进阶:
如果多次调用这个函数,你将如何优化你的算法?

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t res = 0;
        for(int i=0;i<32;i++)
        {
            res = res << 1;
            res = res + (n&1);
            n = n >> 1;
        }
        return res;
    }
};

4.帕斯卡三角形

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

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5
输出:

[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]
class Solution {
public:
    vector> generate(int numRows) {
        vector> res;
        for(int i=0;i row(i+1);
            row[0] = row[i] = 1;
            for(int j=1;j

5.有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: “()”
输出: true
示例 2:

输入: “()[]{}”
输出: true
示例 3:

输入: “(]”
输出: false
示例 4:

输入: “([)]”
输出: false
示例 5:

输入: “{[]}”
输出: true

class Solution {
public:
    bool isValid(string s) {
        stack st;
        for(auto c : s)
        {
            if(st.empty())
                st.push(c);
            else if((c==')' && st.top()=='(')|| (c==']'&&st.top()=='[')|| (c=='}'&&st.top()=='{'))
                st.pop();
            else
                st.push(c);
        }
        if(st.empty())
            return true;
        return false;
    }
};

6.缺失数字

给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。

示例 1:

输入: [3,0,1]
输出: 2
示例 2:

输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

class Solution {
public:
    int missingNumber(vector& nums) {
        int sum1 = 0;
        int sum2 = 0;
        for(int i=0;i<=nums.size();i++)
            sum1 += i;
        for(int j=0;j mp;
        // for(auto n : nums)
        //     mp[n]++;
        // for(int i=0;i<=nums.size();i++)
        //     if(mp[i] == 0)
        //         return i;
    }
};

你可能感兴趣的:(算法)