Leetcode アルゴリズムの面接の質問: 2 番目に高い給与の質問、2 進数の反転の質問、電話番号の文字の組み合わせの質問

2番目に高い給与の問題

Employee テーブルで 2 番目に高い給与 (Salary) を取得する SQL クエリを作成します。

+----+--------+
| ID |給与 |
+-----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |

+--------+--------+ たとえば、上記の Employee テーブルでは、SQL クエリ は次のようになります。最初の 200 を返します。 2 番目に高い給与です。 2 番目に高い給与が存在しない場合、クエリは null を返す必要があります。

+---------------------+
| 2 番目に高い給与 |
+---------------------+
| 200 |
+---------------------+

参考回答

SELECT
    IFNULL(
      (SELECT DISTINCT Salary
       FROM Employee
       ORDER BY Salary DESC
        LIMIT 1 OFFSET 1),
    NULL) AS SecondHighestSalary

バイナリビットの逆転問題

指定された 32 ビット符号なし整数のビットを反転します。

ヒント:

  • Java などの一部の言語では、符号なし整数型が存在しないことに注意してください。この場合、入力と出力の両方が符号付き整数型として指定されますが、整数の内部バイナリ表現は符号付きか符号なしかに関係なく同じであるため、実装には影響しません。

  • Java では、コンパイラは2 の補数表記を使用して符号付き整数を表します。したがって、上記の例 2 では、入力は符号付き整数 -3 を表し、出力は符号付き整数 -1073741825 を表します。

例 1:

入力: 00000010100101000001111010011100
出力: 00111001011110000010100101000000
説明: 入力バイナリ文字列 00000010100101000001111010011100 は、符号なし整数 43261596 を表します。
     したがって、964176192 が返されます。そのバイナリ表現は 00111001011110000010100101000000 です。 

例 2:

入力: 1111111111111111111111111111101
出力: 10111111111111111111111111111111
説明: 入力バイナリ文字列 1111111111111111111111111111101 は、符号なし整数 4294967293 を表します。
     したがって、バイナリ表現が 1011111111111111111111111111111 である 3221225471 が返されます。 

例 1:

入力: n = 00000010100101000001111010011100
出力: 964176192 (00111001011110000010100101000000)
説明: 入力バイナリ文字列 00000010100101000001111010011100 は、符号なし整数 43261596 を表します。
     したがって、964176192 が返されます。そのバイナリ表現は 00111001011110000010100101000000 です。 

例 2:

入力: n = 1111111111111111111111111111101
出力: 3221225471 (10111111111111111111111111111111)
説明: 入力バイナリ文字列 1111111111111111111111111111101 は、符号なし整数 4294967293 を表します。
     したがって、バイナリ表現が 1011111111111111111111111111111 である 3221225471 が返されます。 

ヒント:

入力は長さ 32 のバイナリ文字列です。

参考回答

class Solution {
    
    
private:
    const uint32_t M1 = 0x55555555; // 01010101010101010101010101010101
    const uint32_t M2 = 0x33333333; // 00110011001100110011001100110011
    const uint32_t M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
    const uint32_t M8 = 0x00ff00ff; // 00000000111111110000000011111111
 
public:
    uint32_t reverseBits(uint32_t n) {
    
    
        n = n >> 1 & M1 | (n & M1) << 1;
        n = n >> 2 & M2 | (n & M2) << 2;
        n = n >> 4 & M4 | (n & M4) << 4;
        n = n >> 8 & M8 | (n & M8) << 8;
        return n >> 16 | n << 16;
    }
};

電話番号の文字の組み合わせの問題

数字 2 ~ 9 のみを含む文字列を指定すると、それが表すことができるすべての文字の組み合わせを返します。回答は任意の順序で返すことができます。

数字と文字のマッピングを以下に示します (電話のキーと同じ)。 1 はどの文字にも対応しないことに注意してください。

例 1:

入力:数字 = "23"
出力:["ad"、"ae"、"af"、"bd"、"be"、"bf"、"cd"、"ce"、"cf"]

例 2:

入力: 数字 = ""
出力: []

例 3:

入力: 桁数 = "2"
出力: ["a"、"b"、"c"]

ヒント:

  • 0 <= .length <= 4

  • 数字[i]は['2', '9']の範囲の数値です。

参考回答

class Solution {
    
    
public:
    vector<string> letterCombinations(string digits) {
    
    
        vector<string> combinations;
        if (digits.empty()) {
    
    
            return combinations;
        }
        unordered_map<char, string> phoneMap{
    
    
            {
    
    '2', "abc"},
            {
    
    '3', "def"},
            {
    
    '4', "ghi"},
            {
    
    '5', "jkl"},
            {
    
    '6', "mno"},
            {
    
    '7', "pqrs"},
            {
    
    '8', "tuv"},
            {
    
    '9', "wxyz"}
        };
        string combination;
        backtrack(combinations, phoneMap, digits, 0, combination);
        return combinations;
    }
 
    void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap, const string& digits, int index, string& combination) {
    
    
        if (index == digits.length()) {
    
    
            combinations.push_back(combination);
        } else {
    
    
            char digit = digits[index];
            const string& letters = phoneMap.at(digit);
            for (const char& letter: letters) {
    
    
                combination.push_back(letter);
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.pop_back();
            }
        }
    }
};

2番目に高い給与の問題

Employee テーブルで 2 番目に高い給与 (Salary) を取得する SQL クエリを作成します。

+----+--------+
| ID |給与 |
+-----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |

+--------+--------+ たとえば、上記の Employee テーブルでは、SQL クエリ は次のようになります。最初の 200 を返します。 2 番目に高い給与です。 2 番目に高い給与が存在しない場合、クエリは null を返す必要があります。

+---------------------+
| 2 番目に高い給与 |
+---------------------+
| 200 |
+---------------------+

参考回答

おすすめ

転載: blog.csdn.net/baidu_33164415/article/details/135027525