プログラマーインタビューゴールデンクラシック-インタビューの質問05.04。次の番号

1.トピックの紹介

次の番号。正の整数が与えられた場合、バイナリ式の1の数と同じで、サイズが最も近い2つの数値(1つはわずかに大きく、もう1つはわずかに小さい)を見つけます。

例1:

 入力:num = 2
 出力:[ 4、1
例2:

 入力:num = 1
 出力:[2、-1]
ヒント:

1. numの範囲は[1、2147483647]の間です
。2。条件を満たす前または次の正の数が見つからない場合は、-1を出力します。

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/closed-number-lcci
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

2つの問題解決のアイデア

この質問を理解する方法は2つあります。

方法1

(1)小さい方の値を見つける:入力された正の整数をバイナリ文字列(右側の下位ビット、左側の上位ビット)に変換し、右から左にトラバースして最初の「10」を見つけ、それを「01」に変換して配置します。右側のすべての「1」は左に移動しますが、「01」の位置を超えることはできず、他の位置はゼロに設定されます。

(2)より大きな値を見つける:入力された正の整数を2次文字列に変換し、右から左にトラバースして最初の「01」を見つけ、それを「10」に変換し、位置の右側にあるすべての「1」を見つけます「右に移動すると、他の位置はゼロに設定されます。

(3)ビットセットによって保存されたバイナリ文字列に注意してください。下位ビットが前面にあり、上位ビットが背面にあります。

方法2

(1)小さい方の値の値の範囲は[num-1、num >> 1]であり、F1で表されます。

(2)大きい方の値の値の範囲は[num + 1、num << 1]であり、F2で表されます。

(3)numをバイナリ文字列にカウントした後、1の数はnになります。F1とF2でnumに最も近い数を見つけます。1の数はnの数でもあり、これが結果です。

3つの問題解決コード

方法1のコードは次のとおりです。


class Solution {
public:
    vector<int> findClosedNumbers(int num) {
        bitset<32> s(num);
        bitset<32> b(num);
        //求略小的值
        int a1 = -1;
        for(int i = 1; i < 32; ++i)
        {
            if(s[i] == 1 && s[i-1] == 0)
            {
                s.flip(i-1);
                s.flip(i);
                for(int left = 0, right = i-2; left < right;)
                {
                    while(left < right && s[left] == 0) left++;
                    while(left < right && s[right] == 1) right--;
                    s.flip(left);
                    s.flip(right);
                }
                a1 = (int)s.to_ulong();
                break;
            }
        }

        //求略大值
        int a2 = -1;
        for(int i = 1; i < 32; ++i)
        {
            if(b[i] == 0 && b[i-1] == 1)
            {
                b.flip(i);
                b.flip(i-1);
                for(int left = 0, right = i-2; left < right;)
                {
                    while(left < right && b[left] == 1) left++;
                    while(left < right && b[right] == 0) right--;
                    b.flip(left);
                    b.flip(right);
                }
                a2 = (int)b.to_ulong();
                break;
            }
        }
        return {a2, a1};
    }
};

4つの問題解決の結果

おすすめ

転載: blog.csdn.net/qq_39661206/article/details/108146501