1. 程式人生 > >C++ Leetcode初級演算法之其他篇

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<vector<int>> generate(int numRows) {
        vector<vector<int>> res;
        for(int i=0;i<numRows;i++)
        {
            vector<int> row(i+1);
            row[0] = row[i] = 1;
            for(int j=1;j<i;j++)
                row[j] = res[i-1][j-1]+res[i-1][j];
            res.push_back(row);
        }
        return res;
    }
};

5.有效的括號

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。

示例 1:

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

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

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

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

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

class Solution {
public:
    bool isValid(string s) {
        stack<char> 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<int>& nums) {
        int sum1 = 0;
        int sum2 = 0;
        for(int i=0;i<=nums.size();i++)
            sum1 += i;
        for(int j=0;j<nums.size();j++)
            sum2 += nums[j];
        return sum1-sum2;
        // map<int,int> mp;
        // for(auto n : nums)
        //     mp[n]++;
        // for(int i=0;i<=nums.size();i++)
        //     if(mp[i] == 0)
        //         return i;
    }
};