2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string
2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格,检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为231 − 1。返回整数作为最终结果。注意:本题中的空白字符只包括空格字符 ’ ’ 。除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
福大大 答案2021-09-12:
数位用负数。注意两个byte的数字相减,始终是正数,不可能是负数。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
"strings"
)
func main() {
ret := myAtoi(" +0123456 ")
fmt.Println(ret)
}
func myAtoi(s string) int {
if s == "" {
return 0
}
s = removeHeadZero(strings.Trim(s, " "))
if s == "" {
return 0
}
str := []byte(s)
if !isValid(str) {
return 0
}
// str 是符合日常书写的,正经整数形式
posi := true
if str[0] == '-' {
posi = false
}
minq := math.MinInt64 / 10
minr := math.MinInt64 % 10
res := 0
cur := 0
for i := twoSelectOne(str[0] == '+' || str[0] == '-', 1, 0); i < len(str); i++ {
// 3 cur = -3 '5' cur = -5 '0' cur = 0
cur = int('0') - int(str[i])
if (res < minq) || (res == minq && cur < minr) {
return twoSelectOne(posi, math.MaxInt64, math.MinInt64)
}
res = res*10 + cur
}
// res 负
if posi && res == math.MinInt64 {
return math.MaxInt64
}
return twoSelectOne(posi, -res, res)
}
func twoSelectOne(c bool, a int, b int) int {
if c {
return a
} else {
return b
}
}
func removeHeadZero(str string) string {
r := strings.Index(str, "+") == 0 || strings.Index(str, "-") == 0
s := 0
if r {
s = 1
}
for ; s < len(str); s++ {
if str[s] != '0' {
break
}
}
// s 到了第一个不是'0'字符的位置
e := -1
// 左<-右
for i := len(str) - 1; i >= twoSelectOne(r, 1, 0); i-- {
if str[i] < '0' || str[i] > '9' {
e = i
}
}
//return str[s:twoSelectOne(e == -1, len(str), e)]
// e 到了最左的 不是数字字符的位置
ans := ""
if r {
ans = fmt.Sprintf("%c", str[0])
}
ans = ans + str[s:twoSelectOne(e == -1, len(str), e)]
return ans
}
func isValid(chas []byte) bool {
if chas[0] != '-' && chas[0] != '+' && (chas[0] < '0' || chas[0] > '9') {
return false
}
if (chas[0] == '-' || chas[0] == '+') && len(chas) == 1 {
return false
}
// 0 +... -... num
for i := 1; i < len(chas); i++ {
if chas[i] < '0' || chas[i] > '9' {
return false
}
}
return true
}
执行结果如下:

2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string的更多相关文章
- [原创]SQL表值函数:把用逗号分隔的字符串转换成表格数据
我们日常开发过程中,非常常见的一种需求,把某一个用逗号或者/或者其他符号作为间隔的字符串分隔成一张表数据. 在前面我们介绍了 [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式,当然按照这 ...
- iconv简介(1、字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2、编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有linux等)
iconv简介(1.字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2.编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有lin ...
- 如何实现字符串转换成整数(实现atoi内置函数)?
题目描述 输入一个由数字组成的字符串,把它转换成整数并输出.例如:输入字符串"123",输出整数123. 给定函数原型int StrToInt(const char *str) , ...
- 算法练习-字符串转换成整数(实现atoi函数)
练习问题来源 https://leetcode.com/problems/string-to-integer-atoi/ https://wizardforcel.gitbooks.io/the-ar ...
- C语言atoi()函数:将字符串转换成int(整数)
头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi (const char * str); [函数说明]atoi ...
- 【C语言】编写函数实现库函数atoi,把字符串转换成整形
//编写函数实现库函数atoi.把字符串转换成整形 #include <stdio.h> #include <string.h> int my_atoi(const char ...
- java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)
在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...
- Python2.X如何将Unicode中文字符串转换成 string字符串
Python2.X如何将Unicode中文字符串转换成 string字符串 普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:unicodestring = u&q ...
- Python使用函数实现把字符串转换成整数
需求:假设Python没有提供内置函数int如果使用函数方式实现把一串字符串转换成整数例如把字符串‘12345‘转换成整数12345 思路 1,字符串也是序列可以使用map函数处理分割成一个列表 2, ...
随机推荐
- centos7开放8080端口
1. firewall-cmd --state :令防火墙处于开启状态 systemctl start firewalld.service: 2. firewall-cmd --zone=publi ...
- Java8 获取当天日期的前一天
LocalDateTime.now().plusDays(-1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
- 操作系统 && C语言 每日学习记录(day1 ~ day8) 已寄
现在正式工作了,发现之前学的东西,很多一知半解,不通透,准备再好好系统学一些计算机原理的东西,每天学一学,在这里记录一下. 规划(7.17开始): 同学分享了个超级好的操作系统课程,每天看个一节:ht ...
- 【读书笔记】排列研究-模式避免-续篇Pattern Avoidance
目录 多项式递归Polynomial Recursions P-recursive和c-recursive定义 例子:卡特兰数序列是P-recursive(或者说D-finite) 两个说明\(S_n ...
- Maven安装详解
Maven Maven是apache软件基金会旗下的一个开源项目,是一款用于管理和构建Java项目的工具. Maven的作用? 先来简单介绍一下Maven的作用 (1)依赖管理 方便快捷的管理项目依赖 ...
- Java多线程开发CompletableFuture的应用
做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁 ...
- KCL v0.4.6 alpha 发布!- 更多 Kubernetes 工具集成,更好的 IDE 错误提示
简介 KCL 团队很高兴地宣布 KCL v0.4.6-alpha.1 版本现在已经可用! 您可以在 KCL v0.4.6-alpha.1 发布页面 或者 KCL 官方网站 获得 KCL 二进制下载链接 ...
- Spark基础实验七
今天在做实验七,最开始有许许多多多的错误,最后通过查找.问同学才知道是数据集的格式和存放位置的原因. 就在好不容易解决了上一个错误,下一个错误就立马而来,错误如下: 目前还未找到解决办法,spark实 ...
- selenium中处理验证码问题1-获取验证码图片
selenium中处理验证码问题: 验证码: 基本作用:可以实现当前访问页面的数据安全性.还可以减少用户的并发数:实现大流量的分流 类型:1.纯数字.纯字母 2.汉字组合 3.数学运算题 4.滑动 5 ...
- CentOS8 搭建Kubernetes
CentOS8 搭建Kubernetes 主机名 IP 组件 k8s-master 192.168.40.128/24 kubeadm.kubelet.kubectl.docker-ce k8s-no ...