把字符串转换成整数(最详细解答)

2023-11-03

题目要求:

分析:

  • 把一个一个字符以整数的形式来进行输出,需要考虑相互转化的问题
  • 不能使用库函数!!!
  • 首尾会有空格(进行去空格操作,可以减少不必要的判断)
  • 区分正负正数
  • 结果可能会越界,题目给的是Integer类型,当超过最大范围或者小于最小范围,有不同同的结果输出
  • 不是有效转换要和越界区分开来,当首个字符是字母时或者字符数组的长度为0时,属于无效转换需要返回0

具体解题思路,代码注释全有(几乎每一行都进行了说明) 

class Solution {
    public int strToInt(String str) {
        //去掉首尾的空格
        char[] arr1 = str.trim().toCharArray();

        //如果字符数组的长度为0时,没办法转化,直接返回0
        if(arr1.length == 0){
            return 0;
        }

        //记录符号位 (默认是正数,若是负数将sign置为-1)
        int sign = 1;
        
        //默认是负数,字符数组的1号位置开始遍历,若是正数,将i置为0
        int i = 1;

        //判断第一个位置
        //是负号就将sign置为-1,并且不用更改其实判断位置i
        if(arr1[0] == '-'){
            sign = -1;
        }
        //如果不是正号也不是负号就从0号位置开始
        //有正号和没有正号不影响符号位,但是影响起始判断位置
        if(arr1[0] != '+' && arr1[0] != '-'){
            i = 0;
        }

        //定义一个值,来进行判断(判断条件时会解释)
        int value = Integer.MAX_VALUE / 10;

        //记录返回值
        int result = 0;
        for(int j = i;j < arr1.length;j++){
            //如果字符大于ascii码表中的范围说明是字母直接跳出
            if(arr1[j] > '9' || arr1[j] < '0'){
                break;
            }
            /*
              1.到这一步时,起码证明arr1[1]这是一个数字
              2.result > value 时,我们还没进行扩大倍数的运算,但是他已经比
                value大了,做完扩大倍数运算肯定会越界
              3.当result == value时,不一定会越界,所以取决于后面的个位,如果个位
                大于Integer最大范围的个位时,那就一定会越界
              4.为什么result == value时不一定越界?后续运算是 result * 10
                那么此时做完运算后,等于又回到了和value相等的情况,而不是Integer
                的最大范围所在的那个值,因此,越界与否完全取决于个位情况
            */
            if(result > value || (result == value && arr1[j] > '7')){
                //在这里返回的结果不是不能不能有效运算,而是已经越界,不能返回0
                //需进行两步:1.如果sign == 1,说明时正数,返回最大范围
                //           2.如果不是,那说明是负数,返回最小范围就可以了
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE ; 
            }

            /*
              1.result每更新时在前面的基础上* 10,就相当于把上一次的计算结果扩大了10倍
                后面的每次做加法时,加上去的永远是个位
              2.不能直接进行char和int类型的转化,在ascii码表上的1并不是int的1
                因此借助char类型之间的减法可以将其转化为int
                (arr1[j]- '0')代表着 '?' - '0',可以理解为我们将'0'当做理想的0
            */
            result = result * 10 + (arr1[j] - '0');
        }
        //将符号位与结果结合,正数等于没有做变化,若负数,将等于将这个正数转为其相反数
        return sign * result;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

把字符串转换成整数(最详细解答) 的相关文章

随机推荐

  • vs code 写python代码一直无法使用补全功能 踩坑

    本来用的以下方法使用python补全功能 但随着2020年6月16日发布vscode python 他们删除了该python jediEnabled设置 以支持该python languageServer设置 所以要把 python jed
  • Django数据库查询集数据(Queryset)转化为json,查询value和value_list的用法,json.loads和json.dumps

    文章目录 先简单回顾一下json和字典的区别 问题概述 报错 问题解决 方法一 最原始的方法 方法二 给filter后加个values 方法三 直接按model层设置格式转换 新建toJSon py 调用 返回结果 many True源码分
  • c++之引用及内存分区模型

    内存分区模型 c 程序执行时 将内存大放行划分为4个区域 代码区 存放函数体的二进制码 由操作系统进行管理的 全局区 存放全局变量和静态变量以及常量 栈区 由编译器自动分配释放 存放函数的参数值 局部变量等 堆区 由程序员分配和释放 若程序
  • eclipse安装activiti插件和基本使用

    最近在研究activiti的工作流 在这里做个一系列的总结吧 今天我们看看如果在我们的eclipse中安装activiti的插件 有两种方法 第一种是让eclipse自己去下载 我们告诉他位置 第二种是我们下载好 然后将下载好的内容放到指定
  • xxjob分布式任务调度

    前言 在工作中使用到了定时任务 通过查找资料选择了xxjob 以下是xxjob的介绍以及基本的使用 xxjob介绍 XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 将调度行为抽象形成 调度中心 公
  • 计算机网络基础知识之概念篇

    计算机基础网络之概念篇 计算机网络是什么 计算机拓扑类型 总线拓扑 星型拓扑 环型拓扑 树型拓扑 混合型拓扑 OSI模型 OSI分层协议 数据封装 网络通讯模式 单播 组播 广播 以太网 传输协议 以太网帧结构 MAC地址 集线器 Hub
  • 从硬盘安装 Ubuntu 9.04

    虽然使用wubi可以方便的实现硬盘安装 但总觉得不如真正的原生安装来得稳定 步骤如下 1 磁盘若有空闲空间 则用磁盘管理删除一个空闲分区作为安装xubuntu之用 如若没有空闲分区 则需要将原有的某个分区变小一些 Vista 之前的系统如X
  • 模型评估中测试集的选择方法

    前言 对训练好的模型进行评估 目的是为了测试我们所训练的模型是否拥有好的泛化能力 为此 需使用一个 测试集 来测试学习器对新样本的判别能力 然后以测试集上的 测试误差 作为泛化误差的近似 通常我们假设测试样本也是从样本真实分布中独立同分布采
  • Android 贝塞尔曲线实战之网易云音乐鲸云特效,2021程序员进阶宝典

    一阶这个比较简单 因为没有在网上找到可以直接输入数学公式的工具 就手工推导了下 在这里插入图片描述 https img Android学习笔记总结 最新移动架构视频 大厂安卓面试真题 项目实战源码讲义 docs qq com doc DSk
  • HAL库 STM32CubeMX----SPI驱动OLED 与 IIC驱动MPU6050

    SPI驱动6针OLED SPI的配置方法 芯片的选择 配置RCC SYS 时钟树 设置下载方式 设置系统主频 以上与之前的工程配置相同 可选SPI1或SPI2 Mode模式在此选择全双工主模式 OLED屏幕仅需要接受来自单片机的通信信号 也
  • 【Linux】VNC xfc4安装指导

    1 xfce4软件介绍 Xfce是一个自由软件 运行在类Unix操作系统 如Linux FreeBSD 和 Solaris 上 提供轻量级桌面环境 Xfce快速 轻量 界面美观和对用户友好 Xfce由独立的软件组件构成 可根据需要单独使用或
  • STM32F042F6P6生成HID工程模拟USB鼠标

    原文地址 http www stm32cube com article 141 相关文章 1 STM32F042F6P6 USB设备开发最小系统之键盘示例 http www stm32cube com article 143 就是这个板子
  • 程序员必知的23种设计模式之观察者模式

    文章目录 1 模式引出 天气预报项目需求 1 1 天气预报普通设计方案 1 2 代码实现 2 观察者模式原理 3 观察者模式解决天气预报需求 4 观察者模式的好处 5 观察者模式在Jdk1 8的应用 1 模式引出 天气预报项目需求 天气预报
  • 均值与方差

    均值是指一组数的平均数值 可以分为 算术平均值 一组数求和再除以总个数 它主要表示一组数的平均水平 几何平均值 平方平均值 均方根平均值 调和平均值 加权平均值等 方差 指各个数据与平均数之差的平方和的平均数 方差和标准差都是对一组 一维
  • UGUI改图片:位置、尺寸(踩坑)

    另外一篇博客 UGUI图片 代码修改尺寸 锚定方式为父物体的四条边时 请见 https blog csdn net weixin 42935398 article details 107044335 目录 我的代码 问题 解决 总结 我的代
  • 抽奖组件lucky-canvas

    https 100px net usage wx html 次组件可以画轮盘和九宫格 老虎机抽奖画面
  • 微软必应Bing搜索引擎这几天无法访问!

    微软必应Bing搜索引擎这几天无法访问 一 用必应 Bing 临时域名 www2 bing com 或者 www4 bing com 临时域名博主验证有效 二 修改hosts文件 用户只需要暂时修改下host然后坐等微软服务器恢复后再删除即
  • c#winform使用WebBrowser 大全

    C WinForm WebBrowser 一 MSDN资料 1 主要用途 使用户可以在窗体中导航网页 2 注意 WebBrowser 控件会占用大量资源 使用完该控件后一定要调用 Dispose 方法 以便确保及时释放所有资源 必须在附加事
  • 微信分享链接标题和小图片-不通过公众号接口开发

    方法一 不通过公众号接口开发 在boby 和head之间添加下面的代码即可 图片路径自行修改 注意这个图片必须是大于300px300px的 div style margin 0 auto width 1px height 1px img s
  • 把字符串转换成整数(最详细解答)

    题目要求 分析 把一个一个字符以整数的形式来进行输出 需要考虑相互转化的问题 不能使用库函数 首尾会有空格 进行去空格操作 可以减少不必要的判断 区分正负正数 结果可能会越界 题目给的是Integer类型 当超过最大范围或者小于最小范围 有