LeetCode 7. Reverse Integer

第二次

class Solution
{
 public:
  int reverse(int x) {
    if (overflow(x))
      return 0;
    return reverseIter(0, x);
  }

 private:
  bool overflow(int x) {
    // The number between [-1e9, 1e9] will not cause overflow after reversion.
    if (x >= -1e9 && x <= 1e9)
      return false;
    else if (x == INT_MIN)
      return true;

    //     7463847412 ->  2147483647
    // or -8463847412 -> -2147483648
    // Given an integer x, say its digits is like {x0, x1, ..., x9}
    // 1. The x0 must be 1 or 2, or it will return false before the program runs here
    // 2. We only have to consider the relationship between {x1, ..., x9} and 463847412, which is reverse by the lower digits of INT_MAX
    x = abs(x);
    int bound = reverseIter(0, INT_MAX / 10);
    for (int num = bound; num != 0; num /= 10, x /= 10)
      if (x % 10 > num % 10)
        return true;
      else if (x % 10 < num % 10)
        return false;

    return false;
  }

  inline int reverseIter(int res, int x) {
    if (x == 0)
      return res;
    else
      return reverseIter(res * 10 + x % 10, x / 10);
  }
};

第一次

上界2147483647-, 下界2147483648. 反过来看7463847412 ->  2147483647,  -8463847412 -> -2147483648

为使反转不越界,那么绝对值大于10^9的参数x的前9位应满足<=463847412. 我们没有考虑最高位,是因为最高位一定<=2, 从而<=7或8

所以反转前先检查是否将溢出,溢出时返回-1; 反之开始反转。


代码:

class Solution 
{
public:
	int reverse(int x) 
	{
		if( overflow(x) == true)
		{
			return -1;
		}

		int ret = 0;
		
		while (x!=0)
		{
			ret = 10*ret + x%10;
			x /= 10;
		}

		return ret;
	}
private:
	bool overflow(int x)
	{
		if (x / 1000000000 == 0) // x的绝对值小于1000000000, 不越界
		{
			return false;
		} else if (x == INT_MIN) // INT_MIN反转后越界,也没法按下述方法取绝对值(需要特判),直接返回true
		{
			return true;
		} 
		x = abs(x);
		// x = d463847412 ->  2147483647. (参数x,本身没有越界,所以d肯定是1或2)
		// or -d463847412 -> -2147483648. 
		for (int cmp = 463847412; cmp != 0; cmp/=10, x/=10)
		{
			if ( x%10 > cmp%10 )
			{
				return true;
			} else if (x%10 < cmp%10)
			{
				return false;
			}
		}
		
		return false;
	}
};


引用\[1\]和引用\[2\]提供了两种不同的解决方案来实现整数反转。这两种解决方案都是通过取余和除以10来逐位反转整数。具体来说,我们可以使用一个变量来保存反转后的数,然后循环将原始数除以10,每次取余得到个位数,然后将个位数加到反转数的末尾。最后,根据题目要求,我们需要注意一些边界情况,比如整数溢出的问题。引用\[1\]中的解决方案使用了long long类型来保存反转后的数,并在返回结果之前进行了溢出检查。而引用\[2\]中的解决方案使用了int类型,并在返回结果之前进行了溢出检查。引用\[3\]提供了另一种解决方案,使用了数学转换的方法来实现整数反转。这个解决方案使用了long类型来保存反转后的数,并在返回结果之前进行了溢出检查。根据题目要求,如果反转后的数超过了int类型的范围,我们需要返回0。因此,根据这些引用内容,我们可以得出以下答案: 答案: 整数反转可以通过取余和除以10来逐位反转。我们可以使用一个变量来保存反转后的数,然后循环将原始数除以10,每次取余得到个位数,然后将个位数加到反转数的末尾。最后,根据题目要求,我们需要注意一些边界情况,比如整数溢出的问题。根据引用\[1\]和引用\[2\]提供的解决方案,我们可以选择使用long long类型或int类型来保存反转后的数,并在返回结果之前进行溢出检查。另外,引用\[3\]提供了另一种解决方案,使用了数学转换的方法来实现整数反转。这个解决方案使用了long类型来保存反转后的数,并在返回结果之前进行了溢出检查。根据题目要求,如果反转后的数超过了int类型的范围,我们需要返回0。因此,根据这些引用内容,我们可以选择合适的解决方案来实现整数反转。 #### 引用[.reference_title] - *1* [Reverse-Interger](https://blog.csdn.net/qq_36810403/article/details/77823115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【LeetCode】7.Reverse Interger(简单难度)](https://blog.csdn.net/zeroheitao/article/details/118115782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Reverse Integer](https://blog.csdn.net/whitesun123/article/details/79614218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值