• 7. Reverse Integer


    Given a 32-bit signed integer, reverse digits of an integer.

    自己的代码:

     1 #include<iostream>
     2 using namespace std;
     3 class Solution {
     4 public:
     5     int reverse(int x) {
     6         cout << "x: " << x << endl;
     7         int n = 10;
     8         int ans = 0;
     9         int k = 1;
    10         int flag = 0;
    11         int i = 0;
    12         if (x < 0) {
    13             x = 0 - x;
    14             flag = 1;
    15         }
    16         while (x%n != x) {
    17             n = n * 10;
    18         }
    19         cout << "n: " << n << endl;
    20         i = n/10;
    21         while (i >= 1){
    22             ans = (((x - x % i) / i) % 10)*k + ans;
    23             k = k * 10;
    24             if (i < 10) {
    25                 break;
    26             }
    27             i = i / 10;
    28         } 
    29         cout << "ans: " << ans << endl;
    30         if (ans > INT_MAX || ans < INT_MIN) {
    31             cout << "aaaaa" << endl;
    32         
    33             return 0;
    34         }
    35         else {
    36             cout << "bbbbbb" << endl;
    37             if (flag == 1) {
    38                 return (0 - ans);
    39             }
    40             else {
    41                 return ans;
    42             }
    43         }
    44     }
    45 };
    46 int main() {
    47     Solution my;
    48     cout << my.reverse(112233445566778899) << endl;
    49     return 0;
    50 }

    这段代码逻辑没有问题,测试过一些位数的数字也没有问题,但是问题就处在那些超过int范围的数字,如代码中给出的那个数字,运行结果如下:

    我们可以看到x已经不是原来的x了,这个并不影响程序,但是由此n也不是正常的n了,这个是这段函数出错的根本原因。

    下面贴上正确代码:

     1 class Solution2 {
     2 public:
     3     int reverse(int x) {
     4         cout << "x2: " << x << endl;
     5         int flag = 1;
     6         if (x < 0) flag = -1, x *= -1;
     7         long long sum = 0;
     8         while (x) {
     9             sum = (sum * 10 + (x % 10));
    10             x /= 10;
    11         }
    12         long long ans = sum * flag;
    13         cout << "ans2: " << ans << endl;
    14         return (ans > INT_MAX || ans < INT_MIN) ? 0 : ans;
    15     }
    16 };

    9,10行是算法的精髓。

  • 相关阅读:
    iOS8.1 To iOS8.2
    OAuth授权验证说明
    iOS消息推送
    Swift2
    Swift1
    数据结构,每次看都有不一样的体会
    修改CS、IP的指令(学习汇编)
    C,C++中的堆与栈
    12864显示菜单处理编程
    C编程常见的内存错误
  • 原文地址:https://www.cnblogs.com/yuanninesuns/p/8456671.html
Copyright © 2020-2023  润新知