LeetCode Golang 8. 字符串转换整数 (atoi)

Stella981
• 阅读 547

8. 字符串转换整数 (atoi)

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [-2^31,  2^31 - 1]。如果数值超过这个范围,qing返回  INT_MAX (2^31 - 1) 或 INT_MIN (-2^31) 。

// 运行 4ms, 大部分都是4ms 左右的运行时间

package main

import (
    "fmt"
    "strings"
    "math"
)

// 私有 atoi 转换
// 在任何情况下,若函数不能进行有效的转换时,请返回 0。
// "   -42" -> -42
//输入: "4193 with words"
//输出: 4193
//输入: "words and 987"
//输出: 0
//输入: "-91283472332" < math.MinInt32
//输出: -2147483648
func myAtoi(str string) int {
    if str == "" {
        return 0
    }

    // 有空格前缀则全部替换
    for strings.HasPrefix(str," ") {
        str = str[1:]
    }
    if str == "" {
        return 0
    }
    // 正负符号判定
    sign := 1
    for str[0] == 45 || str[0] == 43{
        if str[0] == 45{
            sign = -1
            str = str[1:]
            break
        }
        if str[0] == 43{
            sign = 1
            str = str[1:]
            break
        }
    }

    if str == "" {
        return 0
    }

    for strings.HasPrefix(str,"0") {
        str = str[1:]
    }
    if str == "" {
        return 0
    }



    tmp := []int{}

    for _,v := range str {
        // ASCII 码 , 57 -> 9 , 48 -> 0
        if v > 57 || v < 48 {
            break
        } else {
            tmp = append(tmp,int(v-48))
        }
    }

    //fmt.Println(tmp)



    // 没有数字返回0
    if len(tmp) == 0 {
        return 0
    }
    // 简单越界处理
    if len(tmp) > 10 || (len(tmp) == 9 && tmp[0] > 2){
        if sign == 1 {
            return math.MaxInt32
        }
        if sign == -1 {
            return math.MinInt32
        }
    }

    j:=len(tmp)-1
    tmpInt := 0
    for i:=0;i<len(tmp);i++{
        tmpInt += tmp[i] * pow10(j)
        j--
    }

    if tmpInt > math.MaxInt32{
        if sign == -1 {
            return math.MinInt32
        } else {
            return math.MaxInt32
        }
    }

    return tmpInt * sign
}

func pow10(i int)int{
    if i == 0 {
        return 1
    }
    rst := 1
    for ;i>0;i--{
        rst *= 10
    }
    return rst
}

func main() {
    fmt.Println(myAtoi("-+2"))
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这