7. Reverse Integer

简介: 7. Reverse Integer

7. Reverse Integer


知识点

1.字符串倒置

#include <cstring>
#include <algorithm>
int main()
{
      string str1;
      cin>>str1;
      cout<<"原始字符串是:"<<str1<<endl;
      reverse(str1.begin(),str1.end());
      cout<<"转换后的字符串是:"<<str1<<endl;
      return 0;
}


2.string转int

string num;
int tmp = stoi(num);


错误示范

class Solution
{
public:
    int reverse(int x)
    {
        while (x % 10 == 0  &&x)
        {
            x /= 10;
        }
        if (x<-pow(2,31)||x>pow(2,31)-1)
        {
            return 0;
        }
        string num = to_string(x);
        std::reverse(num.begin(), num.end());
        char tmp = *(num.end() - 1);
        cout<<x;
        x = stoi(num);
        if (tmp=='-')
        {
            return -1*x;
        }
        return x;
    }
};


这种解法的失败之处在于先转字符串,再字符串转整型时会有溢出的问题,题目说了整数超过32位的有符号整数的范围 [−231, 231 − 1],就返回0。所以要考虑输入1534236469在范围内,可倒置后9646324351就溢出了。


1.白痴解法

class Solution
{
public:
    int reverse(int x)
    {
        cout << x << endl;
        while (x % 10 == 0 && x)
        {
            x /= 10;
        }
        if (x < -pow(2, 31) || x > pow(2, 31) - 1)
        {
            return 0;
        }
        string num = to_string(x);
        std::reverse(num.begin(), num.end());
        cout << "num:" << num << endl;
        char tmp = *(num.end() - 1);
        long int y = atol(num.c_str());
        cout << y;
        if (y < -pow(2, 31) || y > pow(2, 31) - 1)
        {
            return 0;
        }
        if (tmp == '-')
        {
            return -1 * y;
        }
        return y;
    }
};


将string转换成long类型,不齿的通过了。解法过于暴力。


进阶解法

int reverse(int x) 
{
    long result = 0;
    while(x != 0)
    {
        result = result*10 + x % 10;
        x /= 10;
    }
    return (result > INT_MAX || result < INT_MIN)? 0 : result;
}


这种解法通过数学方法倒置了数字,然后用long类型存储,判断用long类型存储的数字是否溢出。


标准解法

class Solution
{
public:
    int reverse(int x)
    {
        int rev = 0;
        while (x)
        {
            int pop = x % 10;
            if (rev > INT_MAX / 10 || rev == INT_MAX / 10 && pop > 7)
            {
                return 0;
            }
            if (rev < INT_MIN / 10 || rev == INT_MIN / 10 && pop < -8)
            {
                return 0;
            }
            x /= 10;
            rev = rev*10+pop;
        }
        return rev;
    }
};


32位有符号整数,最大2147483647,最小-2147483648

就是要注意判断条件,当没算最后一位时,该数大于INT_MAX/10或者最后一位大于INT_MAX范围,则判断为溢出。


感悟

要多思考数学方法,不要一碰到数字题目首先想到的是转字符串。

目录
相关文章
|
6月前
|
搜索推荐 小程序 数据安全/隐私保护
【01】支付宝支付商户申请下户到配置完整流程-申请支付宝商户账户-提交资料审核-申请+配置完整流程-优雅草卓伊凡
【01】支付宝支付商户申请下户到配置完整流程-申请支付宝商户账户-提交资料审核-申请+配置完整流程-优雅草卓伊凡
644 1
【01】支付宝支付商户申请下户到配置完整流程-申请支付宝商户账户-提交资料审核-申请+配置完整流程-优雅草卓伊凡
|
10月前
|
存储 监控 安全
智慧社区可视化解决方案:科技引领社区服务与管理新篇章
智慧社区通过现代科技整合区域资源,提升治理和服务水平,为居民提供便捷、高效、安全的生活环境。其特点包括科技赋能、资源整合和以人为本,旨在实现社区现代化管理,提高居民满意度。未来将应用更多创新技术,推动社区治理现代化。
381 16
|
10月前
|
安全 PHP 开发者
php中配置variables_order详解
`variables_order` 是 PHP 配置中的一个关键指令,它决定了不同来源的变量被导入到全局变量空间的顺序。正确配置 `variables_order` 不仅可以确保变量的正确处理和覆盖顺序,还能提高应用程序的安全性。开发者应根据具体应用的需求,合理配置 `variables_order`,确保应用的稳定和安全运行。
127 5
|
存储 SQL 测试技术
Entity Framework Core 中的存储过程超厉害!从定义到调用全攻略,提升性能与安全性!
【8月更文挑战第31天】在现代软件开发中,数据库操作效率至关重要。Entity Framework Core(EF Core)作为强大的对象关系映射(ORM)框架,支持存储过程,可提升数据库操作的性能、安全性和可维护性。本文详细介绍如何在 EF Core 中定义、配置及调用存储过程,并提供最佳实践建议,包括性能优化、安全性增强、代码可维护性提升以及参数化查询等。通过遵循这些指导原则,开发者能够充分利用存储过程的优势,显著提高应用程序质量和性能。附带完整示例代码,展示从定义实体类到调用存储过程的全过程。
763 0
|
敏捷开发 IDE API
阿里云云效产品使用问题之如何实现按分支发布部分服务
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
消息中间件 存储
消息队列之RabbitMQ之主题(Topics)模式
RabbitMQ是一个消息中间件,它接受并转发消息。它有6中工作模式,而主题模式是它的核心。在主题模式中,主要是通配符的添加与使用。
476 0
|
JSON fastjson 数据格式
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(5)
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(5)
171 0
第7章 符号计算——7.9 符号微分方程求解
第7章 符号计算——7.9 符号微分方程求解
|
前端开发 开发工具 git
前端hook项目moblie总结笔记-忽略提交的git文件
前端hook项目moblie总结笔记-忽略提交的git文件
123 0
前端hook项目moblie总结笔记-忽略提交的git文件