Kotlin实现LeetCode算法题之String to Integer (atoi)
题目String to Integer (atoi)(难度Medium)

大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理。
方案1
class Solution {
fun myAtoi(str: String): Int {
val maxInt = "
val maxIntS = "+2147483647"
val minIntS = "-2147483648"
val lengthMI = maxInt.length
val lengthMIS = maxIntS.length
var result = ""
var strR = str.trim()
//strR为空
if (strR.isEmpty()) {
}
//strR不为空,且不以+/-开头
] && ]) {
//不以数字开头
].isDigit()) {
}
//以数字开头
for (c in strR) {
if (c.isDigit()) {
result += c
} else {
break
}
}
if (result.length > lengthMI ||
(result.length == lengthMI && result > maxInt)) {
result = maxInt
}
return result.toInt()
}
//strR以+/-开头
//后不是跟数字
|| (strR.length > && !strR[].isDigit())) {
}
//后跟数字
result += strR[]
, strR.length)) {
if (c.isDigit()) {
result += c
} else {
break
}
}
] == '+' && (result.length > lengthMIS ||
(result.length == lengthMIS && result > maxIntS))) {
result = maxIntS
} ] == '-' && (result.length > lengthMIS ||
(result.length == lengthMIS && result > minIntS))) {
result = minIntS
}
return result.toInt()
}
}
将数字及其长度这种常量抽象出来,不至于代码中充斥着一丢重复的数字和长度计算,争取在平时的编码过程中养成好习惯。
说到习惯,代码中还有一点提一下,在对字串进行符号存在性、符号后字符等多种情况的判断时并没有使用一长串的if..else..,而是每个小分支直接用return终止。这样的好处是代码可读性与可维护性强,编码过程中不会因分支过多而可能搞混或出现漏处理的情况。
代码先用trim()将字串开头的空字符去除(如果存在的话),然后对有/无符号、是否紧跟数字等多种情况做了清晰的判断和相应的处理。
LeetCode提交详情

从上图看,总共测试了1047个数据,耗时582ms。
测试代码:
fun main(args: Array<String>) {
val start = System.currentTimeMillis()
println(Solution().myAtoi("-0000000000000000006666666bb6aa"))
val end = System.currentTimeMillis()
println(end - start)
}
测试数据
这篇文章先不看算法的耗时,重点关注用于测试的数据。
根据题目的描述,给定字串中应该是可以包含任意字符的,需要我们用代码进行处理,输出要求的结果。
那么,来看几组测试字串及其输出结果:
" +0aa",0,返回正确的数值0
" +066bb6aa",66
" -06 6bb6aa",-6
" -06666666666666666666bb6aa",-2147483648,数值向下越界
"06666666666666666666bb6aa",2147483647,数值向上越界
"0000000000000000006666666bb6aa",2147483647,???错误的结果,应该是6666666
"a0000000066bb6aa",0,不以符号或数字开头,直接返回0
"- 0000000066bb6aa",0,符号后跟的不是数字,直接返回0
结果分析
可以看到,除了打问号的那一组测试案例,其他均得到了符号要求的结果。即对于不满足要求的字串直接返回0,字串开头的空字符不应影响结果,获取数据过程中遇到非数字立马终止等。
由于题目的描述中并没有具体指明测试字串会是什么样,也没有针对开头很多0的情况进行说明,虽然提交后是accepted状态,但为了算法的严谨性,还是需要对上面出错的情况做进一步的处理。
方案2
class Solution {
fun myAtoi(str: String): Int {
val maxInt = "
val maxIntS = "+2147483647"
val minIntS = "-2147483648"
val lengthMI = maxInt.length
val lengthMIS = maxIntS.length
var result = ""
var strR = str.trim()
//strR为空
if (strR.isEmpty()) {
}
//strR不为空,且不以+/-开头
] && ]) {
//不以数字开头
].isDigit()) {
}
//以数字开头
for (c in strR) {
if (c.isDigit()) {
result += c
} else {
break
}
}
&& result[] == ') {
result = result.removeRange(, )
}
if (result.length > lengthMI ||
(result.length == lengthMI && result > maxInt)) {
result = maxInt
}
return result.toInt()
}
//strR以+/-开头
//后不是跟数字
|| (strR.length > && !strR[].isDigit())) {
}
//后跟数字
result += strR[]
, strR.length)) {
if (c.isDigit()) {
result += c
} else {
break
}
}
&& result[] == ') {
result = result.removeRange(, )
}
] == '+' && (result.length > lengthMIS ||
(result.length == lengthMIS && result > maxIntS))) {
result = maxIntS
} ] == '-' && (result.length > lengthMIS ||
(result.length == lengthMIS && result > minIntS))) {
result = minIntS
}
return result.toInt()
}
}
代码第31-33及56-58行,其实就是针对数据开头的0进行了移除(当然数据只有一个数字且为0是要保留的),因为开头0的存在不会影响数据的大小,反而会干扰字串的长度计算。测试结果:
"-0000000000000000006666666bb6aa",-6666666
Kotlin实现LeetCode算法题之String to Integer (atoi)的更多相关文章
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Repeated String Match(Java实现)
这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...
- LeetCode算法题-Construct String from Binary Tree(Java实现)
这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...
- LeetCode算法题-Reverse String II(Java实现)
这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...
- LeetCode算法题-Reverse String(Java实现)
这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...
- LeetCode算法题-Backspace String Compare(Java实现)
这是悦乐书的第327次更新,第350篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第197题(顺位题号是844).给定两个字符串S和T,如果两个字符串都输入到空文本编辑器 ...
- LeetCode【8】. String to Integer (atoi) --java实现
String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...
- Kotlin实现LeetCode算法题之Two Sum
LeetCode介绍 LeetCode是算法练习.交流等多功能网站,感兴趣的同学可以关注下(老司机请超车).页面顶部的Problems菜单对应算法题库,附带历史通过滤.难易程度等信息. 未来计划 打算 ...
- Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...
随机推荐
- [js高手之路] javascript面向对象写法与应用
一.什么是对象? 对象是n个属性和方法组成的集合,如js内置的document, Date, Regexp, Math等等 document就是有很多的属性和方法, 如:getElementById, ...
- hadoop(二)搭建伪分布式集群
前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...
- Python 基础系列一:初识python(二)基本数据类型
上节拾遗 1.编码转换过程,utf-8转换gbk 过程 经过解码(py27): x.decode('utf-8')-->unicode-->编码x.encode('gbk') ps:py3 ...
- HDU1223 Order Count 动态规划 组合数
动态规划+组合数+大数 #include<cstdio> #include<cstdlib> #include<iostream> #include<algo ...
- 通过VBA,当在EXCEL单元格中输入任意的日期格式时,都能自动转换为指定的标准格式的日期值
在日常录入EXCEL表格的单元格里 ,我们输入一些一般性的日期内容,如:2017-10-17 或 2017/10/17时,EXCEL会自动识别为日期并按单元格设计格式显示,单元格中存储的值也是日期格式 ...
- c语言构造类型之数组_01
构造类型--constructed type.至于定义,笔者就省略了,有兴趣的同学可以百度搜索https://www.baidu.com/.今天我们要说的是c语言中最简单的构造类型--数组(array ...
- RichEditBox 使用自定义菜单
老周:当RichEditBox控件的上下文菜单即将弹出时,会引发ContextMenuOpening事件,我们需要处理该事件,并且将e.Handled属性设置为true,这样才能阻止默认上下文菜单的弹 ...
- PHP中header的作用
1.跳转: //若等待时间为0,则与header("location:")等效. //Header("Location:http://localhost//sessio ...
- 【持续更新】.Net 开发中给自己埋下的坑!
1.文件“XXX”正在由另一进程使用,因此该进程无法访问此文件. 原因剖析:文件在主线程操作,在子线程中读写操作文件,刚开始没有意识到程序的问题所在,总是在FileStream中报错,google后常 ...
- Linux系统网络基本配置
1. ifconfig命令的使用: (1)查看所有网卡基本信息:ifconfig (2)查看特定网卡信息:ifconfig (网卡名,如:eht0) (3)停止网卡设备服务:ifconfig (网卡名 ...