当前位置:网站首页>字符串转换整数 (atoi)
字符串转换整数 (atoi)
2022-08-09 12:00:00 【爱敲代码的Harrison】
题目
力扣链接:字符串转换整数 (atoi)
代码
package com.lt.tiq01;
/** * @author Harrison * @create 2022-06-26-11:20 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */
public class P006_StringToIntegerAtoi {
public int myAtoi(String s) {
if(s==null || s.equals("")){
return 0;
}
// trim()把字符串的空格去掉,一个系统函数
s=removeHeadZero(s.trim());
if(s==null || s.equals("")){
return 0;
}
char[] str=s.toCharArray();
if(!isValid(str)){
return 0;
}
// str 是符合日常书写的,正经整数形式
// 为什么一定要转成负数的形式接着?
// -2147483648
// 2147483647
// 因为负数的绝对值比正数的绝对值大1,如果硬要拿正数接着
// 那么字符串"2147483648"就没法转换了,但其实按要求应转换为系统最大2147483647
// 因为是用负数的形式接着,所以不会溢出
boolean posi=str[0]=='-'?false:true;
int minq=Integer.MIN_VALUE/10;
int minr=Integer.MIN_VALUE%10;
int res=0;
int cur=0;
for(int i=(str[0]=='-' || str[0]=='+')?1:0; i<str.length; i++){
cur='0'-str[i];
if(res<minq || (res==minq && cur<minr)){
// 正数溢出返回系统最大,负数溢出返回系统最小
return posi?Integer.MAX_VALUE:Integer.MIN_VALUE;
}
res=res*10+cur;
}
// "-2147483648" -> -2147483648
// "2147483647" -> 2147483647
// res是用负数形式表达的
// "2147483648" -> 2147483647
// 下面if的情况,res是正数的形式,但却是系统最小,不会溢出,因为使用负数形式接着的
// 这种情况下转成系统最大
if(posi && res==Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}
return posi?-res:res;
}
public static String removeHeadZero(String str){
boolean r=(str.startsWith("+") || str.startsWith("-"));
// 如果原字符串第一个字符包含'+'或'-',那就从第二个字符开始找第一个不是'0'的字符
int s=r?1:0;
for(; s<str.length(); s++){
if(str.charAt(s)!=0){
// 找到第一个不是字符'0'的位置
break;
}
}
// s 到了第一个不是'0'字符的位置
int e=-1;
// 左<-右(从右往左找第一个不是数字字符的位置)
for(int i=str.length()-1; i>=(r?1:0); i--){
if(str.charAt(i)<'0' || str.charAt(i)>'9'){
e=i;
}
}
// e 到了最左的 不是数字字符的位置
// substring(s,e) 左闭右开[s,e)
// 如果e==-1,说明s后面都是数字字符
// 再加上第一个字符'+'或者'-',如果有的话
return (r?String.valueOf(str.charAt(0)):"")+str.substring(s,e==-1?str.length():e);
}
// isValid() 检查是否是有效的整数
public static boolean isValid(char[] chas){
if(chas[0]!='-' && chas[0]!='+' && (chas[0]<'0' || chas[0]>'9')){
return false;
}
if((chas[0]=='-' || chas[0]=='+') && chas.length==1){
return false;
}
// 上面两个if没中,只剩下三张情况
// 0 +... -... num
// 0位置字符是'+',后面是数字字符
// 0位置字符是'-',后面是数字字符
// 0位置就是数字字符,后面也是
// 然后接着从1位置开始检查,如果中间有任何不是数字字符,直接return false
for(int i=1; i<chas.length; i++){
if(chas[i]<'0' || chas[i]>'9'){
return false;
}
}
// 经过上面的层层过滤,剩下的字符串一定是符合我们日常书写的,正经的整数形式
return true;
}
}
边栏推荐
猜你喜欢
听声辨物,这是AI视觉该干的???|ECCV 2022
无需精子卵子子宫体外培育胚胎,Cell论文作者这番话让网友们炸了
微信一面:一致性哈希是什么,使用场景,解决了什么问题?
Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
AQS Synchronization Component - FutureTask Analysis and Use Cases
你没见过的《老友记》镜头,AI给补出来了|ECCV 2022
程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
Simple understanding of ThreadLocal
Ways to prevent data fraud
罗振宇折戟创业板/ B站回应HR称用户是Loser/ 腾讯罗技年内合推云游戏掌机...今日更多新鲜事在此...
随机推荐
Web console control edit box
Go-based web access parameters
Programmer's Exclusive Romance - Use 3D Engine to Realize Fireworks in 5 Minutes
水能自发变成“消毒水”,83岁斯坦福教授:揭示冬天容易得流感的部分原因...
【小程序】低代码+小游戏=小游戏可视化开发
正则表达式(规则,匹配,和实际使用)
李开复花上千万投的缝纫机器人,团队出自大疆
How to upload local file trial version in binary mode in ABAP report
Ways to prevent data fraud
MongoDB-查询中$all的用法介绍
Two ways to enter the Oracle database
微信支付开发流程
Apexsqlrecover无法连接数据库
MySQL中的锁
WeChat Mini Program Payment and Refund Overall Process
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
WeChat side: what is consistent hashing, usage scenarios, and what problems does it solve?
FFmpeg在win10上编译安装(配置libx264)
Simple understanding of ThreadLocal
阿里云新增三大高性能计算解决方案,助力生命科学行业快速发展