【leetcode】7反転整数(c++)

2572 ワード

タイトルリンク
32ビットの符号付き整数を指定し、整数の数値を反転します.
例1:
  : 123
  : 321

例2:
  : -123
  : -321

例3:
  : 120
  : 21

注意:
我々の環境では32ビットの符号付き整数しか記憶できないと仮定し,その数値範囲は[−231,231−1]である.この仮定によれば,反転後の整数がオーバーフローすると0を返す.
leetcodeとpatが違うと思うのはprintfの穴をくぐれないこと...どうやって戻るかは順番に配列に入れて返さなければならない.
注意点:
1オーバーフローの判定:境界値MAXとMINが設定されている
2マイナス記号「-」の処理:反転して末尾のを削除し、トップに追加(もっと簡単な方法がたくさんあるはず)
3末尾0の処理atoi関数は自分で処理しました
コミットコード
class Solution {
public:
    int reverse(int x) {
        int MAX = 0x7fffffff;
        int MIN = 1 << 31;
        ostringstream stream,smax,smin;
        string ss;
        stream << x;
        ss += stream.str();
        smax << MAX;
        string max_num = smax.str();
        smin << MIN;
        string min_num = smin.str();
        std::reverse(ss.begin(),ss.end());
        if(x<0){//     “-”
            ss.insert(0,"-");
            ss.pop_back();
        }
        if(x > 0 &&  ss.size() >= max_num.size() && (ss > max_num)) return 0;//  
        else if(x < 0 && ss.size() >= min_num.size() && ss > min_num)  return 0;//  
        else return atoi(ss.c_str()); 
    }
};

デバッグコード
#include
#include
#include
#include
#include
using namespace std;

int main(){
    int x;
    int MAX = 0x7fffffff;
    int MIN = 1 << 31;
    scanf("%d",&x);
    ostringstream stream,smax,smin;
    string ss;
    stream << x;
    ss += stream.str();
    smax << MAX;
    string max_num = smax.str();
    smin << MIN;
    string min_num = smin.str();

    std::reverse(ss.begin(),ss.end());
    if(x<0){
        ss.insert(0,"-");
        ss.pop_back();
    }

    //compare with string
    printf("%s
",ss.c_str()); printf("%s
",min_num.c_str()); if(x > 0 && ss.size() >= max_num.size() && (ss > max_num)) printf("01
");//return 0 else if(x < 0 && ss.size() >= min_num.size() && (ss > min_num)) printf("02
");// printf("%d",atoi(ss.c_str())); }