Kotlin实现LeetCode算法题之String to Integer (atoi)
题目String to Integer (atoi)(难度Medium)
大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理。
方案1
1 class Solution { 2 fun myAtoi(str: String): Int { 3 val maxInt = "2147483647" 4 val maxIntS = "+2147483647" 5 val minIntS = "-2147483648" 6 val lengthMI = maxInt.length 7 val lengthMIS = maxIntS.length 8 var result = "" 9 var strR = str.trim() 10 11 //strR为空 12 if (strR.isEmpty()) { 13 return 0 14 } 15 16 //strR不为空,且不以+/-开头 17 if ('+' != strR[0] && '-' != strR[0]) { 18 //不以数字开头 19 if (!strR[0].isDigit()) { 20 return 0 21 } 22 23 //以数字开头 24 for (c in strR) { 25 if (c.isDigit()) { 26 result += c 27 } else { 28 break 29 } 30 } 31 if (result.length > lengthMI || 32 (result.length == lengthMI && result > maxInt)) { 33 result = maxInt 34 } 35 return result.toInt() 36 } 37 38 //strR以+/-开头 39 //后不是跟数字 40 if (strR.length == 1 || (strR.length > 1 && !strR[1].isDigit())) { 41 return 0 42 } 43 44 //后跟数字 45 result += strR[0] 46 for (c in strR.subSequence(1, strR.length)) { 47 if (c.isDigit()) { 48 result += c 49 } else { 50 break 51 } 52 } 53 if (result[0] == '+' && (result.length > lengthMIS || 54 (result.length == lengthMIS && result > maxIntS))) { 55 result = maxIntS 56 } else if (result[0] == '-' && (result.length > lengthMIS || 57 (result.length == lengthMIS && result > minIntS))) { 58 result = minIntS 59 } 60 return result.toInt() 61 } 62 }
将数字及其长度这种常量抽象出来,不至于代码中充斥着一丢重复的数字和长度计算,争取在平时的编码过程中养成好习惯。
说到习惯,代码中还有一点提一下,在对字串进行符号存在性、符号后字符等多种情况的判断时并没有使用一长串的if..else..,而是每个小分支直接用return终止。这样的好处是代码可读性与可维护性强,编码过程中不会因分支过多而可能搞混或出现漏处理的情况。
代码先用trim()将字串开头的空字符去除(如果存在的话),然后对有/无符号、是否紧跟数字等多种情况做了清晰的判断和相应的处理。
LeetCode提交详情
从上图看,总共测试了1047个数据,耗时582ms。
测试代码:
1 fun main(args: Array<String>) { 2 val start = System.currentTimeMillis() 3 println(Solution().myAtoi("-0000000000000000006666666bb6aa")) 4 val end = System.currentTimeMillis() 5 println(end - start) 6 }
测试数据
这篇文章先不看算法的耗时,重点关注用于测试的数据。
根据题目的描述,给定字串中应该是可以包含任意字符的,需要我们用代码进行处理,输出要求的结果。
那么,来看几组测试字串及其输出结果:
" +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
1 class Solution { 2 fun myAtoi(str: String): Int { 3 val maxInt = "2147483647" 4 val maxIntS = "+2147483647" 5 val minIntS = "-2147483648" 6 val lengthMI = maxInt.length 7 val lengthMIS = maxIntS.length 8 var result = "" 9 var strR = str.trim() 10 11 //strR为空 12 if (strR.isEmpty()) { 13 return 0 14 } 15 16 //strR不为空,且不以+/-开头 17 if ('+' != strR[0] && '-' != strR[0]) { 18 //不以数字开头 19 if (!strR[0].isDigit()) { 20 return 0 21 } 22 23 //以数字开头 24 for (c in strR) { 25 if (c.isDigit()) { 26 result += c 27 } else { 28 break 29 } 30 } 31 while (result.length > 1 && result[0] == '0') { 32 result = result.removeRange(0, 1) 33 } 34 if (result.length > lengthMI || 35 (result.length == lengthMI && result > maxInt)) { 36 result = maxInt 37 } 38 return result.toInt() 39 } 40 41 //strR以+/-开头 42 //后不是跟数字 43 if (strR.length == 1 || (strR.length > 1 && !strR[1].isDigit())) { 44 return 0 45 } 46 47 //后跟数字 48 result += strR[0] 49 for (c in strR.subSequence(1, strR.length)) { 50 if (c.isDigit()) { 51 result += c 52 } else { 53 break 54 } 55 } 56 while (result.length > 2 && result[1] == '0') { 57 result = result.removeRange(1, 2) 58 } 59 if (result[0] == '+' && (result.length > lengthMIS || 60 (result.length == lengthMIS && result > maxIntS))) { 61 result = maxIntS 62 } else if (result[0] == '-' && (result.length > lengthMIS || 63 (result.length == lengthMIS && result > minIntS))) { 64 result = minIntS 65 } 66 return result.toInt() 67 } 68 }
代码第31-33及56-58行,其实就是针对数据开头的0进行了移除(当然数据只有一个数字且为0是要保留的),因为开头0的存在不会影响数据的大小,反而会干扰字串的长度计算。测试结果:
"-0000000000000000006666666bb6aa",-6666666
转载于:https://www.cnblogs.com/tgyf/p/7804934.html
Kotlin实现LeetCode算法题之String to Integer (atoi)相关推荐
- LeetCode算法题-Repeated String Match(Java实现)
这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...
- leetcode算法题--Decode String
原题链接:https://leetcode.com/problems/decode-string/ string decodeString(string s) {int n = s.size(), i ...
- leetcode算法题--Magical String
原题链接:https://leetcode.com/problems/magical-string/ int magicalString(int n) {string s = "122&qu ...
- Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 1 import java.util.* 2 3 class Solutio ...
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
- LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...
- LeetCode算法题-Valid Palindrome II(Java实现)
这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- LeetCode算法题-Factorial Trailing Zeroes(Java实现)
这是悦乐书的第183次更新,第185篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第42题(顺位题号是172).给定一个整数n,返回n!中的尾随零数.例如: 输入:3 输 ...
最新文章
- PHP 模拟POST请求
- Unicode字符集下CString/tchar*与char *转换 (解决中文乱码等)
- OpenCV拼接细节stitching detailed的实例(附完整代码)
- WebService系列之使用Axis获取天气预报数据
- 什么镜头最适合拍风景_为什么您的风景摄影套件中应始终装有远摄镜头
- python mysql 时间比较大小_python时间函数与mysql时间函数转换
- Android中打包含有Activity以及资源文件的jar包在工程中调用
- 关于 IMPP/XMPP/SIMPLE 这几种即时通讯协议和NAT traversal
- Java学习笔记(JDBC数据库编程常用接口)
- python怎么恢复默认窗口_如何恢复python编程环境spyder的窗口?
- 录音转文字 android,录音转文字pro
- 如何让自己不再暴躁易怒
- “The file being opened for reading does not exist“-HyperMesh
- 计算机应用参考文献,计算机应用领域英文参考文献 哪里有计算机应用领域参考文献...
- 《CSDN排行榜冲榜攻略》妙用Emoji表情符号读者提升阅读体验(编码表)
- mysql auto increment offset_MySQL auto_increment_increment,auto_increment_offset 用法
- 中文分词_数据分析之中文分词
- 浅析我国地球科学研究现状及其它
- 水瓶座可笑却笑不出的悲哀 - Qzone日志
- 二手苹果电脑交易的坑和辨别真伪的一些方法总结(下篇)
热门文章
- 原子自增_多线程系列-(六)原子类与CAS(了解即可)
- 如何用计算机画磁滞回线,[画图的问题]怎么画类似于磁滞回线的图像?一个x值对应两个y值的...
- 理光打印机如何设置邮件服务器,技术员帮您win10系统网络共享理光打印机的设置方法的操作办法...
- java 类加载器卸载,【深入明白Java虚拟机 】类加载器的命名空间以及类的卸载...
- 什么是SQL Server DATEDIFF()方法?
- chips cope_Android P:Chips and ChipGroup
- android 崩溃捕获_Android使用FileProvider捕获图像相机图库
- Elasticsearch的javaAPI之get,delete,bulk
- 使用PS从图片中抠取签章部分
- Spring Data JPA 必须掌握的 20+ 个查询关键字