力扣 - 剑指 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控制符号
- 首先,我们使用Java的
代码
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)\),将字符串转换成字符数组所占用的空间
力扣 - 剑指 Offer 67. 把字符串转换成整数的更多相关文章
- 剑指 Offer 67. 把字符串转换成整数 + 字符串
剑指 Offer 67. 把字符串转换成整数 Offer_67 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...
- 【Java】 剑指offer(67) 把字符串转换成整数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请你写一个函数StrToInt,实现把字符串转换成整数这个功能 ...
- Go语言实现:【剑指offer】把字符串转换成整数
该题目来源于牛客网<剑指offer>专题. 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入描述: 输入一个字符串,包括数字字母符号,可以为空. 输出描述: 如果是合 ...
- 剑指Offer 49. 把字符串转换成整数 (字符串)
题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...
- [剑指Offer] 49.把字符串转换成整数
题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 [思路]考虑所有特殊情况 1.数字前面有空格,如s=" 12 ...
- 力扣 - 剑指 Offer 46. 把数字翻译成字符串
题目 剑指 Offer 46. 把数字翻译成字符串 思路1(递归,自顶向下) 这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字 ...
- 剑指offer49:把字符串转换成整数
1 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不 ...
- 《剑指offer》面试题67. 把字符串转换成整数
问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...
- [LeetCode]面试题67. 把字符串转换成整数
题目 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们 ...
随机推荐
- 使用IntelliJ工具打包kotlin为bat文件运行报错 Exception in thread "main" java.lang.NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError 这个很有可能是因为idea里的java版本与电脑上的java环境 ...
- disruptor笔记之三:环形队列的基础操作(不用Disruptor类)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- jmeter跑脚本的注意事项
指标主要看以下几点: 1.jmeter性能测试的报告,不要看平均响应时间,而是看90%响应时间,一般不能超过3s,超过3s则不符合标准2.响应时间超过3s就要优化,但不是平均响应时间,因为最小响应时间 ...
- P2490-[SDOI2011]黑白棋【博弈论,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P2490 题目大意 一个长度为\(n\)的棋盘上放下\(k\)个棋子. 第一个要是白色,下一个要是黑色,在下一个是白 ...
- 单机百万连接调优和Netty应用级别调优
作者:Grey 原文地址:单机百万连接调优和Netty应用级别调优 说明 本文为深度解析Netty源码的学习笔记. 单机百万连接调优 准备两台Linux服务器,一个充当服务端,一个充当客户端. 服务端 ...
- logback日志入门超级详细讲解
基本信息 日志:就是能够准确无误地把系统在运行状态中所发生的情况描述出来(连接超时.用户操作.异常抛出等等): 日志框架:就是集成能够将日志信息统一规范后输出的工具包. Logback优势 Logba ...
- 自然语言处理标注工具——Brat(安装、测试、使用)
一.Brat标注工具安装 1.安装条件: (1)运行于Linux系统(window系统下虚拟机内linux系统安装也可以) (2)目前brat最新版本(v1.3p1)仅支持python2版本运行使用( ...
- 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
作者 | 山猎 近年来,Serverless 一直在高速发展,并呈现出越来越大的影响力.主流的云服务商也在不断地丰富云产品体系,提供更好的开发工具,更高效的应用交付流水线,更好的可观测性,更细腻的产品 ...
- Perl 编程 基础用法
Perl 编程 标准头部写法 #!/usr/bin/perl -w # 标准的头部写法,-w意为显示警告 变量 $a=$b+10 # $a和$b都不需要定义,拿过来就用 Note: $flag=0 如 ...
- python的参数传递是值传递还是引用传递?都不是!
[写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblo ...