• 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行是算法的精髓。

  • 相关阅读:
    在 SVG 中添加交互性
    大型Web2.0站点构建技术初探 (转)
    鼠标右键右键菜单
    用SVG技术实现动态图形输出的嵌入式Web服务
    使用脚本动态操作 SVG 文档
    GDI+技术的坐标解决方案
    一个项目的粗略流程
    xml矢量图:svg的viewBox和vml的coordsize决定的虚坐标系简说
    用VML画图(一些基本的矢量图)
    列出本地可用字体
  • 原文地址:https://www.cnblogs.com/yuanninesuns/p/8456671.html
Copyright © 2020-2023  润新知