Reverse Integer

一. Reverse Integer

Reverse digits of an integer.
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

Example:

x = 123, return 321
x = -123, return -321

Difficulty:Easy

TIME:30MIN

解法一

数字和字符串之间可以相互转换,如果可以反转字符串,那当然也可以反转数字。第一种解法就是将数字变为字符串,然后反转字符串,最后再变回数字,不过要多加一个对负号的判定。还有就是要判定数字是否超出了 int 类型的范围,这里是在程序中计算了 int 类型的边界。不过这种解法依赖于C++的库。

int reverse(int x) {
    string s = to_string(x);
    int len = s.size();
    char tmp;
    int index = 0;
    if (s[0] == '-') {
        index++;
    }
    for (int i = len - 1; i >= (len + index) / 2; i--) {
        tmp = s[i];
        s[i] = s[len - 1 - i + index];
        s[len - 1 - i + index] = tmp;
    }
    long result = stol(s);
    if (result > pow(2, 31) - 1 || result < -pow(2, 31))
        result = 0;
    return (int)result;
}

代码的时间复杂度为 O(n)

优化

以上的代码存在一些问题,列举如下:

  • 其实并不需要将数字转为字符串,因为如果用数字来直接反转的话,代码应该会更加简洁,因为不需要判定负号。
  • 另外就是判断结果是否超出 int 类型边界,不需要在程序中算出 int 类型的上下界,因为C和C++已经定义了很多库和变量表示这些东西。

解法二

下面是优化过后的代码。这里通过一个递归表达式,可以很方便地将数字反转。

int reverse(int x) {
    long result = 0;
    while(x) {
        result = 10 * result + x % 10;
        x /= 10;
    }
    if(result > INT32_MAX || result < INT32_MIN)
        result = 0;
    return (int)result;
}

代码的时间复杂度为 O(n)

总结

现在把写代码遇到的问题总结一下:

unsigned类型的比较

我们都知道,容器调用 size() 函数返回的是 size_t 的类型,这是一个无符号的整形变量。因为是无符号的,所以比较的时候要格外小心。比如:

unsigned int i = 0;
cout << (i < -1) << endl; //1
cout << i - 1 << endl; //4294967295

不管是比较的时候,还是做算术运算的时候,C++都倾向于把数值往大的数据类型转换,这里也不例外。因此当判断一个无符号整形是否小于一个负数的时候,程序是先将负数提升为无符号的整形,然后再比较,因此结果一般都是 true ,与我们的预期相差甚远。因此,一定要注意不要将无符号的变量和负数以及可能出现负数的变量进行比较,也不能让无符号的变量减去一个可能大于自身的数字

C中保存内置类型大小上限的变量

其中 int 类型的变量上限定义在 stdint.h 的头文件中(应该是默认包含的),列举如下:

#define INT8_MIN         (-127i8 - 1)
#define INT16_MIN        (-32767i16 - 1)
#define INT32_MIN        (-2147483647i32 - 1)
#define INT64_MIN        (-9223372036854775807i64 - 1)
#define INT8_MAX         127i8
#define INT16_MAX        32767i16
#define INT32_MAX        2147483647i32
#define INT64_MAX        9223372036854775807i64
#define UINT8_MAX        0xffui8
#define UINT16_MAX       0xffffui16
#define UINT32_MAX       0xffffffffui32
#define UINT64_MAX       0xffffffffffffffffui64

C++中保存内置类型信息的类

C++有一个模板类保存着各种内置类型的额外信息,这个类名为 numeric_limits ,包含在 limits 头文件下。如果要用到 int 类型的大小上限信息可以如下书写:

cout << numeric_limits<int>::min() << endl; //-2147483648
cout << numeric_limits<int>::max() << endl; //2147483647

当然还有很多额外的信息,可以参考:http://www.cplusplus.com/reference/limits/numeric_limits/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值