Kotlin实现LeetCode算法题之String to Integer (atoi)

时间:2023-02-13 16:23:19

题目String to Integer (atoi)(难度Medium)

Kotlin实现LeetCode算法题之String to Integer (atoi)

大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出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提交详情

Kotlin实现LeetCode算法题之String to Integer (atoi)

从上图看,总共测试了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)的更多相关文章

  1. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  2. LeetCode算法题-Repeated String Match(Java实现)

    这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...

  3. LeetCode算法题-Construct String from Binary Tree(Java实现)

    这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...

  4. LeetCode算法题-Reverse String II(Java实现)

    这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...

  5. LeetCode算法题-Reverse String(Java实现)

    这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...

  6. LeetCode算法题-Backspace String Compare(Java实现)

    这是悦乐书的第327次更新,第350篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第197题(顺位题号是844).给定两个字符串S和T,如果两个字符串都输入到空文本编辑器 ...

  7. LeetCode【8】&period; String to Integer &lpar;atoi&rpar; --java实现

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  8. Kotlin实现LeetCode算法题之Two Sum

    LeetCode介绍 LeetCode是算法练习.交流等多功能网站,感兴趣的同学可以关注下(老司机请超车).页面顶部的Problems菜单对应算法题库,附带历史通过滤.难易程度等信息. 未来计划 打算 ...

  9. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

随机推荐

  1. Leetcode 313&period; super ugly number

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  2. &lpar;转&rpar;redis 学习笔记&lpar;1&rpar;-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  3. 【Spring】Spring IOC原理及源码解析之scope&equals;request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  4. linux内核--进程空间(二)

        内核处理管理本身的内存外,还必须管理用户空间进程的内存.我们称这个内存为进程地址空间,也就是系统中每个用户空间进程所看到的内存.linux操作系统采用虚拟内存技术,因此,系统中的所有进程之间虚 ...

  5. 设置自己Eclipse代码风格(内部)

    经过这几次的代码提交,发现很多人的代码风格不够规范.个人认为很有必要强制性规定一下代码的规范. 整体来说,有三种代码风格,其中两种类似于这样的: public void function(){ //f ...

  6. Ubuntu 12&period;04上安装MySQL并运行

    Ubuntu 12.04上安装MySQL并运行 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 安装MySQL数据库 sudo apt-get upda ...

  7. asp&period;net core 依赖注入实现全过程粗略剖析(2)

    接着 上篇 目前也算是交代清楚了相关的类.那么框架具体是如何来实例化的呢?整个的流程是怎么样的. 我们参考源码中的Test文件夹来看看: var collection = new ServiceCol ...

  8. java多线程中的死锁情况读书笔记

    多线程中的死锁 在前面的分析中,我们知道一个对象可以用Synchronized方法或者其他的加锁形式来防止别的任务在互斥还没有释放的时候就访问这个对象. 试想一下这样的情况:某个任务在等待另一个任务, ...

  9. 微信小程序入门实例之记事本

    主要实现思想都在代码的注释中,项目源码见github 首先上项目目录 app.js文件代码如下: //app.js App({ onLaunch: function() { //调用API从本地缓存中 ...

  10. 【BZOJ1187】&lbrack;HNOI2007&rsqb;神奇游乐园 插头DP

    [BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...