题目

剑指 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控制符号

代码

  1. class Solution {
  2. public int strToInt(String str) {
  3. char[] cs = str.trim().toCharArray();
  4. // 非空格的字符长度为0,直接返回0
  5. if (cs.length == 0) {
  6. return 0;
  7. }
  8. // 符号标志,代表正负号,默认为正
  9. int sign = 1;
  10. // 存储结果
  11. int res = 0;
  12. // 默认第一位是符号,所以从第二位开始计算,即1
  13. int index = 1;
  14. // 阈值
  15. int threshold = Integer.MAX_VALUE / 10;
  16. // 判断第一位非空格的的字符
  17. if (cs[0] == '-') {
  18. // 负号
  19. sign = -1;
  20. } else if (cs[0] != '+') {
  21. // 如果不是正号的话,我们先默认:第一位是数字、为正数,下面再进行判断
  22. index = 0;
  23. }
  24. // 根据前面的index判断是从第0位还是第1位开始判断
  25. for (int i = index; i < cs.length; i++) {
  26. // 不是数字就直接结束
  27. if (cs[i] < '0' || cs[i] > '9') {
  28. break;
  29. }
  30. // 超出范围
  31. if (res > threshold || (res == threshold && cs[i] > '7')) {
  32. return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
  33. }
  34. // 进行拼接
  35. res = res*10 + (cs[i] - '0');
  36. }
  37. return sign * res;
  38. }
  39. }

复杂度分析

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

力扣 - 剑指 Offer 67. 把字符串转换成整数的更多相关文章

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

    剑指 Offer 67. 把字符串转换成整数 Offer_67 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...

  2. 【Java】 剑指offer(67) 把字符串转换成整数

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请你写一个函数StrToInt,实现把字符串转换成整数这个功能 ...

  3. Go语言实现:【剑指offer】把字符串转换成整数

    该题目来源于牛客网<剑指offer>专题. 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入描述: 输入一个字符串,包括数字字母符号,可以为空. 输出描述: 如果是合 ...

  4. 剑指Offer 49. 把字符串转换成整数 (字符串)

    题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...

  5. [剑指Offer] 49.把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0  [思路]考虑所有特殊情况 1.数字前面有空格,如s="    12 ...

  6. 力扣 - 剑指 Offer 46. 把数字翻译成字符串

    题目 剑指 Offer 46. 把数字翻译成字符串 思路1(递归,自顶向下) 这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字 ...

  7. 剑指offer49:把字符串转换成整数

    1 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不 ...

  8. 《剑指offer》面试题67. 把字符串转换成整数

    问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数.   首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...

  9. [LeetCode]面试题67. 把字符串转换成整数

    题目 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们 ...

随机推荐

  1. dede调用文章内第一张原始图片(非缩略图)的实现方法

    第一步,修改include/extend.func.php文件,最下面插入函数,查询的是文章附加表,如需查询图片集什么的,改表名即可 //取原图地址 function GetFirstImg($arc ...

  2. java基础之AQS

    Java开发中,我们的应用程序经常会使用多线程提高程序的运行效率,多线程情况下访问线程共享变量可能会带来并发问题,此时就需要并发锁解决并发问题.Java提供了两种类型的并发控制机制:synchonri ...

  3. 后台开发 3个题目 array_chunk, 100块钱找零钱(动态规划 dynamic programming), 双向循环链表 llist 删除节点

    1. array_chunk 实现 http://php.net/manual/en/function.array-chunk.php <?php function my_array_chunk ...

  4. Python实现Telnet连接

    import loggingimport telnetlibimport timeclass TelnetClient(): def __init__(self,): self.tn = telnet ...

  5. 『Python』列表生成式、生成器与迭代器

    1. 迭代 在 Python中, 迭代是通过 for ... in 来完成的, 而很多语言比如 C 语言, 迭代 list 是通过下标完成的. Python 的 for 循环抽象程度要高于 C 的 f ...

  6. Centos7 安装 .Net Core2.2

    添加 rpm 源 sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 开始 ...

  7. 浅聊Linux的五种IO模型

    在日常 Coding 中,多多少少都会接触到网络 IO,就会想要深入了解一下.看了很多文章,总是云里雾里的感觉,直到读了<UNIX网络编程 卷1:套接字联网API>中的介绍后,才豁然开朗. ...

  8. AT4144-[ARC098D]Donation【Kruskal重构树,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4144 题目大意 \(n\)个点\(m\)条边的一张无向联通图,每个点有两个值\(a_i,b_i\).表示经过该 ...

  9. 踩坑系列《八》解决Win10没有找到Hyper-v的错误

    最近要安装docker,所以得开启Hyper属性面板,找了下,发现电脑上没有看到该属性. 在这之前,得先判断,你电脑是不是支持Hyper,打开cmd窗口,输入systeminfo 看看最下面Hyper ...

  10. MySQL技术专题(X)该换换你的数据库版本了,让我们一同迎接8.0的到来哦!(初探篇)

    前提背景 MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web应用方面 MySQ ...