题目

剑指 Offer 67. 把字符串转换成整数

思路1

  • 根据题意,要解决这题,首先要判断的条件有:

    • 不包括首位空格
    • 第一位必须为:+-、数字三者其一,否则不合法
    • 数字必须连续的,如果遇到非数字,结束判断
    • 判断结果要在 \(-2^{31}\)~\((2^{31}-1)\) 之间,如果超过的话,就输出最大值 / 最小值
  • 我们用sign记录符号、res记录每次遍历累加的值、threshold记录阈值(我们阈值取Integer.MAX_VALUE/10,即小了一位数,作用后面再说)、index记录开始的索引。接下来开始解析:
    • 首先,我们使用Java的trim方法去除首位空格
    • 然后判断第一位的字符是什么,为负号sign就为-1,默认是正号1。同时还要设置开始比遍历的索引index,如果为负号或者显示的正号,我们就设置为1(因为这两个符号都占了一个位置),否则就默认从0开始(这时候不用管是否为数字,这个判断留到下面再去判断)
    • 接下来根据前面设置的index,从index开始遍历字符串,判断每一位字符:
      • 如果不为数字则跳出循环;
      • 如果res结果大于阈值res还没加上当前值,因为如果res已经大于阈值了,不管当前值是多大也没有影响)则说明拼接后的值已经超过了Integer.MAX_VALUE,需要返回整数的最大值;
      • 如果res == threshold,且当前的值也大于7(为什么要大于7呢,因为大于7就说明大于正整数的最大值,前几位一样,那么就比较最后一位嘛),此时再根据符号,直接返回最大值即可。
      • (注意:因为最大正整数和最小负整数不仅仅是符号不一样的区别,将最小负整数去掉符号之后,还是比最大正整数的值还大1。所以这个是如何保证能正确判断呢?主要是在cs[i] > '7'这个地方:这个条件判断了如果res等于最大正整数,此时不是直接返回最大正整数,而是进行拼接,进行下一轮判断,当然,如果是负数的话,达到-2147483647也是进行拼接,如果是-2147483648,那么就会直接返回最大负整数,这也就是为什么c[i]要大于7而不是大于等于‘7了)
    • 如果上一步都没超最大值,此时讲当前值拼接到res中即可:res = res*10 + (cs[i] - '0');
    • 最后返回res*sign,由sign控制符号

代码

class Solution {
public int strToInt(String str) {
char[] cs = str.trim().toCharArray(); // 非空格的字符长度为0,直接返回0
if (cs.length == 0) {
return 0;
} // 符号标志,代表正负号,默认为正
int sign = 1;
// 存储结果
int res = 0;
// 默认第一位是符号,所以从第二位开始计算,即1
int index = 1;
// 阈值
int threshold = Integer.MAX_VALUE / 10; // 判断第一位非空格的的字符
if (cs[0] == '-') {
// 负号
sign = -1;
} else if (cs[0] != '+') {
// 如果不是正号的话,我们先默认:第一位是数字、为正数,下面再进行判断
index = 0;
} // 根据前面的index判断是从第0位还是第1位开始判断
for (int i = index; i < cs.length; i++) {
// 不是数字就直接结束
if (cs[i] < '0' || cs[i] > '9') {
break;
} // 超出范围
if (res > threshold || (res == threshold && cs[i] > '7')) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
// 进行拼接
res = res*10 + (cs[i] - '0');
} return sign * res; }
}

复杂度分析

  • 时间复杂度:\(O(N)\),线性遍历数组所需时间为\(O(N)\)
  • 空间复杂度:\(O(N)\),将字符串转换成字符数组所占用的空间

最新文章

  1. jcFeather Maya 羽毛插件
  2. css3动画效果
  3. 作业总结(一):IE6下面的那些坑
  4. 如何查询Oracle中所有用户信息
  5. Python装饰器笔记
  6. Core Text概述
  7. linux C(hello world) 解方程
  8. mysql中文乱码解决
  9. shop++ 安装
  10. 改善C#程序的50种方法
  11. 【Node】SuperAgent
  12. html里的table如何在表格内部保留表格横线的同时去掉表格里的竖线
  13. Dialog 顶部黑线问题
  14. Java加密与解密笔记(一) Base64和数据摘要算法
  15. spring启动component-scan类扫描加载过程(转)
  16. Perl的子程序
  17. 转自ruby迷: 使用Net::SSH和Net::SCP编写Linux服务器管理脚本
  18. 跑道标识和那些复杂的灯光系统 and 简介、编号、参数、标志及数量 and 飞机跑道标准与参数
  19. php error_log记录日志的使用方法和配置 (日志目录一定要手动创建)
  20. linux下,将一个目录中的图片文件合成为gif图片

热门文章

  1. switchery插件:多个按钮,用jquery进行切换
  2. Shell系列(4)- 历史命令
  3. Java学习之随堂笔记系列——day01
  4. Java-Ide快速创建getter&amp;setter方法
  5. 如何通过云效Flow完成自动化部署—主机部署
  6. P4258-[WC2016]挑战NPC【带花树】
  7. 分组密码(四)AES算法① — 密码学复习(七)
  8. C# WPF MVVM项目实战(进阶②)
  9. Apache Struts2 S2-013远程代码执行漏洞复现
  10. 从零入门 Serverless | SAE 的远程调试和云端联调