【每日一題】整數翻轉

整數反轉

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123
輸出: 321
示例 2:

輸入: -123
輸出: -321
示例 3:

輸入: 120
輸出: 21

注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

1、字符串翻轉
把 x 轉爲字符串,字符串翻轉後轉整數,然後返回。

class Solution {
public:
	int reverse(int x) {
		if (x == INT_MIN) {
			return 0;
		}
		if (x < 0) {
			return -reverse(-x);
		}
		long res = 0;
		string str = std::to_string(x);
		string res_str;
		for (int i = str.size() - 1; i >= 0; --i) {
			res_str.push_back(str[i]);
		}
		res = std::atoi(res_str.c_str());
		if (res > INT_MAX) {
			return 0;
		}
		return res;
	}
};

2、數學方法
取個位,然後給 res * 10 + 個位。

class Solution {
public:
    int reverse(int x) {
        if (x == INT_MIN) {
        	return 0;
        }
        if (x < 0) {
        	return -reverse(-x);
        }

        long res = 0;
        while (x > 0) {
        	int e = x % 10;
        	x /= 10;
        	res = res * 10 + e;
        }
        if (res > INT_MAX) {
        	return 0;
        }

        return res;
    }
};

// 下面是評論中的方法
int reverse(int x)
{
    int max = 0x7fffffff, min = 0x80000000;//int的最大值最小值
    long rs = 0;//用long類型判斷溢出
    for(;x;rs = rs*10+x%10,x/=10);//逆序,正負通喫,不用單獨考慮負值
    return rs>max||rs<min?0:rs;//超了最大值低於最小值就返回0
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章