第八题:字符串转换整数 (atoi)

2024-09-04 01:52

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

题目描述

实现 myAtoi(string s) 函数,将字符串转换成 32 位有符号整数。函数首先丢弃字符串前面的空格字符,直到找到第一个非空格字符为止。然后,选择该非空格字符和之后的连续字符组成一个存储整数的字符串。字符串可以包含额外字符,这些字符在形成整数的字符串后面,并被忽略。如果第一个非空格字符不是数字且不是符号+ 或者-,则不进行转换并返回 0。如果转换过程中存在任何无法识别的字符,则提前停止转换,并返回已经得到的结果。如果转换后的结果超过 32 位有符号整数范围 [−2^31, 2^31 − 1],则返回整数边界。

实现思路

  1. 忽略字符串前导空格。
  2. 检查是否有正负号,并初始化结果变量。
  3. 从第一个非空字符开始,逐个检查是否为数字。
  4. 如果遇到非数字字符,停止处理。
  5. 将数字字符转换为整数并累加到结果中。
  6. 检查结果是否溢出,并在必要时修正结果。
  7. 返回最终结果。

算法实现

C

int myAtoi(char *str) {long res = 0;int i = 0, sign = 1;while (str[i] == ' ') i++; // 忽略前导空格if (str[i] == '-' || str[i] == '+') { // 处理正负号sign = (str[i++] == '-') ? -1 : 1;}while (str[i]) {if (str[i] >= '0' && str[i] <= '9') {res = res * 10 + (str[i++] - '0');if (res > INT_MAX) return (sign == -1) ? INT_MIN : INT_MAX; // 检查溢出} else break; // 非数字字符,停止处理}return res * sign; // 应用正负号
}

Python

def myAtoi(s: str) -> int:import res = s.lstrip()if not s: return 0match = re.match(r"^[+-]?(\d+)", s)if not match: return 0result = int(match.group(0))return max(min(result, 2**31 - 1), -2**31)

Java

public int myAtoi(String s) {long result = 0;int sign = 1;int index = 0;int n = s.length();// 忽略前导空格while (index < n && s.charAt(index) == ' ') index++;// 处理正负号if (index < n && (s.charAt(index) == '+' || s.charAt(index) == '-')) {sign = s.charAt(index++) == '+' ? 1 : -1;}// 转换数字并检查溢出while (index < n && Character.isDigit(s.charAt(index))) {int digit = s.charAt(index++) - '0';if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && digit > 7)) {return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;}result = 10 * result + digit;}return (int) (sign * result);
}

时间复杂度

时间复杂度为 O(n),其中 n 是字符串的长度。这是因为算法需要遍历整个字符串来查找数字并计算结果。空间复杂度为 O(1),因为使用的额外空间不依赖于输入字符串的大小。

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



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

相关文章

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n