Skip to content

Files

Latest commit

4d6c701 · Feb 21, 2024

History

History
218 lines (177 loc) · 5.91 KB

File metadata and controls

218 lines (177 loc) · 5.91 KB

中文文档

Description

Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.

Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

 

Example 1:

Input: x = 123
Output: 321

Example 2:

Input: x = -123
Output: -321

Example 3:

Input: x = 120
Output: 21

 

Constraints:

  • -231 <= x <= 231 - 1

Solutions

Solution 1: Mathematics

Let's denote m i and m x as 2 31 and 2 31 1 respectively, then the reverse result of x , a n s , needs to satisfy m i a n s m x .

We can continuously take the remainder of x to get the last digit y of x , and add y to the end of a n s . Before adding y , we need to check if a n s overflows. That is, check whether a n s × 10 + y is within the range [ m i , m x ] .

If x > 0 , it needs to satisfy a n s × 10 + y m x , that is, a n s × 10 + y m x 10 × 10 + 7 . Rearranging gives ( a n s m x 10 ) × 10 7 y .

Next, we discuss the conditions for the inequality to hold:

  • When a n s < m x 10 , the inequality obviously holds;
  • When a n s = m x 10 , the necessary and sufficient condition for the inequality to hold is y 7 . If a n s = m x 10 and we can still add numbers, it means that the number is at the highest digit, that is, y must not exceed 2 , therefore, the inequality must hold;
  • When a n s > m x 10 , the inequality obviously does not hold.

In summary, when x > 0 , the necessary and sufficient condition for the inequality to hold is a n s m x 10 .

Similarly, when x < 0 , the necessary and sufficient condition for the inequality to hold is a n s m i 10 .

Therefore, we can check whether a n s overflows by checking whether a n s is within the range [ m i 10 , m x 10 ] . If it overflows, return 0 . Otherwise, add y to the end of a n s , and then remove the last digit of x , that is, x x 10 .

The time complexity is O ( log | x | ) , where | x | is the absolute value of x . The space complexity is O ( 1 ) .

class Solution:
    def reverse(self, x: int) -> int:
        ans = 0
        mi, mx = -(2**31), 2**31 - 1
        while x:
            if ans < mi // 10 + 1 or ans > mx // 10:
                return 0
            y = x % 10
            if x < 0 and y > 0:
                y -= 10
            ans = ans * 10 + y
            x = (x - y) // 10
        return ans
class Solution {
    public int reverse(int x) {
        int ans = 0;
        for (; x != 0; x /= 10) {
            if (ans < Integer.MIN_VALUE / 10 || ans > Integer.MAX_VALUE / 10) {
                return 0;
            }
            ans = ans * 10 + x % 10;
        }
        return ans;
    }
}
class Solution {
public:
    int reverse(int x) {
        int ans = 0;
        for (; x; x /= 10) {
            if (ans < INT_MIN / 10 || ans > INT_MAX / 10) {
                return 0;
            }
            ans = ans * 10 + x % 10;
        }
        return ans;
    }
};
func reverse(x int) (ans int) {
	for ; x != 0; x /= 10 {
		if ans < math.MinInt32/10 || ans > math.MaxInt32/10 {
			return 0
		}
		ans = ans*10 + x%10
	}
	return
}
impl Solution {
    pub fn reverse(mut x: i32) -> i32 {
        let is_minus = x < 0;
        match x.abs().to_string().chars().rev().collect::<String>().parse::<i32>() {
            Ok(x) => x * (if is_minus { -1 } else { 1 }),
            Err(_) => 0,
        }
    }
}
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
    const mi = -(2 ** 31);
    const mx = 2 ** 31 - 1;
    let ans = 0;
    for (; x != 0; x = ~~(x / 10)) {
        if (ans < ~~(mi / 10) || ans > ~~(mx / 10)) {
            return 0;
        }
        ans = ans * 10 + (x % 10);
    }
    return ans;
};
public class Solution {
    public int Reverse(int x) {
        int ans = 0;
        for (; x != 0; x /= 10) {
            if (ans < int.MinValue / 10 || ans > int.MaxValue / 10) {
                return 0;
            }
            ans = ans * 10 + x % 10;
        }
        return ans;
    }
}
int reverse(int x) {
    int ans = 0;
    for (; x != 0; x /= 10) {
        if (ans > INT_MAX / 10 || ans < INT_MIN / 10) {
            return 0;
        }
        ans = ans * 10 + x % 10;
    }
    return ans;
}
class Solution {
    /**
     * @param int $x
     * @return int
     */

    function reverse($x) {
        $isNegative = $x < 0;
        $x = abs($x);

        $reversed = 0;

        while ($x > 0) {
            $reversed = $reversed * 10 + ($x % 10);
            $x = (int) ($x / 10);
        }

        if ($isNegative) {
            $reversed *= -1;
        }
        if ($reversed < -pow(2, 31) || $reversed > pow(2, 31) - 1) {
            return 0;
        }

        return $reversed;
    }
}