一週間目のLeetCodeアルゴリズムの問題の二


タイトル:Reverse Integer
難易度:Easy
タイトル説明:Reverse digits of an integer.Example 1:x=123,return 321 Example 2:x=-123,return-321 Note:The input is asumed to be a 32-bit signed integer.Your function shound shound return 0 when the reversever.frever.
テーマ分析:この問題は前の問題に比べて難しいです.まず、数字を反転させて考えたのは、数字を一桁ずつ取り出して、逆の順番で組み合わせます.このステップは難しくないです.それぞれ数字のビット値を取って、型取り法を使ってもいいです.まず数字を10に取って、一番低い数字を得て、それから10で割ると、今度は10に対して型を取ると、最後から二番目の数字が得られます.このように繰り返して、すべての桁の数字が取れるまで.これらの数字を保存します.その後、逆の順序で新しい値を取り出して組み合わせると、一応結果が得られます.この問題の難点は問題のヒントです.32桁の符号数の表示法を使うので、反転した数字は32桁の表示範囲を超える可能性があります.解答者はこの点を考慮する必要があります.まず、32ビットの符号数の範囲は−2147483648から2147483647までです.では、符号のある逆数がこの範囲を超えているかどうかをどう判断しますか?ブロガーが最初に思いついた方法は、直接に簡単で乱暴な判断をすることです.判断結果は上記の範囲を超えていますか?
if (result > 2147483647 || result < (-2147483648)) {
  return 0;
}
しかしこのような考えはあまりにも無邪気で、明らかに通用しないのです.reult自体も32桁の記号があるので、彼はこの範囲を超えないはずです.範囲を超える例を挙げます.
Input: 1534236469
Output: 1056389759
Expected: 0
では、他に何か巧妙な方法がありますか?ブロガーが観察したところ、逆転値が範囲を超えるテスト数は基本的に一つの特徴があります.つまり、反転値の各ビットは基本的に私たちが予想していた数字とは違っています.反転値が範囲を超えているので、システムは自動的に範囲化しています.このような処理は多くのビットで予想されている数字とは違っています.しかも同じ可能性は10%しかありません.私達はこの点を利用して、新しい検査を書き出すことができます.結果のある人とそれに対応する期待数を比較して、もし違ったら、90%の自信があれば、表示範囲を超えたと確定します.この正確な比率を上げるには、比較した桁数を増やすだけでいいです.最後のACコードは以下の通りです.
class Solution {
public:
    int reverse(int x) {
        queue<int> q;
        int tx = x;
        while (tx != 0) {
          int temp = tx % 10;
          q.push(temp);
          tx /= 10;
        }
        int result = 0;
        int store;
        while (!q.empty()) {
          result = result*10 + q.front();
          store = q.front();
          q.pop();
        }
        if (store != result%10)
          return 0;
        return result;
    }
};