LeetCode8-字符串转换整数(atoi)

2023-11-22 00:01

本文主要是介绍LeetCode8-字符串转换整数(atoi),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.大神解法
  • 2.我的辣鸡解法:
  • 3.整数相加的溢出判断(chaGPT代码)
  • 4.整数相乘溢出判断(chatGPT代码)

到目前为止比较简单容易理解的一个代码:
参考链接:
🔗:【8. 字符串转换整数 String to Integer (atoi) 【LeetCode 力扣官方题解】-哔哩哔哩】

1.大神解法

累乘和累加,不需要调用pow函数,比我的垃圾解法快得多!判断整数溢出的点比从后往前算要少!
判断整数溢出的逻辑是:
1.如果ans比MAX_value的10分之1大,则乘以10累加之后绝对溢出.
2.如果我恰好等于max_value的10分之1,则需要计算max_value的个位数,如果在当前ans的最后一位数的前提下,ans的大小恰好等于max_value的 10分之1,并且最后以为大于等于max_value的个位数,则ans乘以10累加max_value个位数之后一腚溢出!这是精准的判断!

class Solution {public int myAtoi(String s) {boolean negative=false;char[] ch=s.toCharArray();int i=0,ans=0,n=ch.length;if(s==null||n==0){return 0;}while(i<n&&(ch[i]==' ')){++i;}if(i==n){return 0;}if (ch[i]=='-') {negative=true;}if (ch[i]=='+'||ch[i]=='-') {i++;}while (i < ch.length && ch[i] <= '9' && ch[i] >= '0') {int r = ch[i] - '0';if (ans>Integer.MAX_VALUE/10||(ans==Integer.MAX_VALUE/10&&r>Integer.MAX_VALUE%10)) {return !negative?Integer.MAX_VALUE:Integer.MIN_VALUE;}ans=ans*10+r;++i;}return !negative?ans:-ans;}}

2.我的辣鸡解法:

公式是:
ans = ans + digit*Math.pow
从后往前算,累加,比较费劲,不如大神解法来的直接!大神解法维护的变量少,而且速度更快!而且我的这个算法有两个整数溢出的点,需要判断整数溢出的语句更多更复杂!

class Solution {public int myAtoi(String s) {if(s==null||s.length()==0){return 0;}boolean hashNum=false,negative=false;char[] ch=s.toCharArray();int i=0,ans=0,n=ch.length;while(i<n&&(ch[i]==' ')){++i;}int tmp_idx=i;while(i<n&&!(ch[i]>='1'&&ch[i]<='9')&&(ch[i]!='-'&&ch[i]!='+')){++i;}if(i<n&&(ch[i]=='-'||ch[i]=='+')){negative= ch[i]=='+'?false:true;i=tmp_idx+1;}else{//没有+的情况negative=false;i=tmp_idx;}while(i<n&&ch[i]=='0'){++i;}while(i<n){if((ch[i]<='9'&&ch[i]>='1')){break;}else{return 0;}}int j=i;while(j<n){if((ch[j]<='9'&&ch[j]>='0')){++j;}else{--j;break;}}if(j>=n||(!(ch[j]<='9'&&ch[j]>='0'))){--j;}int itg=j-i;//假如是3位数,则itg=2,10位数,itg=9if(itg>10){return !negative?Integer.MAX_VALUE:Integer.MIN_VALUE;}int index=0;//10^(index)次方while(index<=itg){if(((ch[j]-'0')>=3&&index>=9)||((ch[j]-'0')>=2&&index>=10)){return !negative?Integer.MAX_VALUE:Integer.MIN_VALUE;}int rhs=((ch[j]-'0')*(int)Math.pow(10,index));if(ans>Integer.MAX_VALUE-rhs){return !negative?Integer.MAX_VALUE:Integer.MIN_VALUE;}else {ans+=rhs;}++index;--j;if(j-i>=itg){break;}}return !negative?ans:-ans;}}

3.整数相加的溢出判断(chaGPT代码)

public class OverflowExample {public static void main(String[] args) {int a = 2147483647;  // 最大的int值int b = 1;if (willAdditionOverflow(a, b)) {System.out.println("Overflow detected!");} else {int result = a + b;System.out.println("Result: " + result);}}private static boolean willAdditionOverflow(int a, int b) {// 如果 a 和 b 同号,且它们的和与 a 的符号不同,即溢出if (b > 0 && a > Integer.MAX_VALUE - b) {return true;}if (b < 0 && a < Integer.MIN_VALUE - b) {return true;}return false;}
}

4.整数相乘溢出判断(chatGPT代码)

对于整数相乘,溢出的判断逻辑相对复杂一些,因为整数相乘可能会导致更大范围的结果。以下是一个通用的整数相乘的溢出判断逻辑的代码:

public class OverflowExample {public static void main(String[] args) {int a = 2147483647;  // 最大的int值int b = 2;if (willMultiplicationOverflow(a, b)) {System.out.println("Overflow detected!");} else {int result = a * b;System.out.println("Result: " + result);}}private static boolean willMultiplicationOverflow(int a, int b) {// 特殊处理乘法溢出的边界情况if (a == 0 || b == 0) {return false;}// 如果 a 为正,且 b 大于 Integer.MAX_VALUE / a,或者 a 为负,且 b 小于 Integer.MIN_VALUE / a,即溢出if ((a > 0 && b > Integer.MAX_VALUE / a) || (a < 0 && b < Integer.MIN_VALUE / a)) {return true;}return false;}
}

在这个代码中,willMultiplicationOverflow 方法首先处理了特殊情况,即其中一个因子为0。然后,它检查是否会发生溢出,主要是通过判断 a 的正负以及 b 是否足够大或足够小。这是因为 Integer.MAX_VALUE 和 Integer.MIN_VALUE 在绝对值上是相差1的,而在相乘时,结果的范围是 [Integer.MIN_VALUE, Integer.MAX_VALUE],因此需要额外的条件判断。

请注意,在实际编程中,可能需要更复杂的判断逻辑,尤其是在处理更大范围的整数时。此外,如果需要处理更大的整数,可能需要考虑使用 long 类型,因为它的范围更广。

这篇关于LeetCode8-字符串转换整数(atoi)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/406031

相关文章

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map