丝绸之路网站建设策划书,专门做预售的网站,制作一个app软件,网站建设288《算法通关村——不简单的字符串转换问题》
8. 字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数#xff0c;使其能将字符串转换成一个 32 位有符号整数#xff08;类似 C/C 中的 atoi 函数#xff09;。
函数 myAtoi(string s) 的算法如下#xff1a;
读入…《算法通关村——不简单的字符串转换问题》
8. 字符串转换整数 (atoi)
请你来实现一个 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 。返回整数作为最终结果。
注意
本题中的空白字符只包括空格字符 。除前导空格或数字后的其余字符串外请勿忽略 任何其他字符。
示例 1
输入s 42
输出42
解释加粗的字符串为已经读入的字符插入符号是当前读取的字符。
第 1 步42当前没有读入字符因为没有前导空格^
第 2 步42当前没有读入字符因为这里不存在 - 或者 ^
第 3 步42读入 42^
解析得到整数 42 。
由于 42 在范围 [-231, 231 - 1] 内最终结果为 42 。示例 2
输入s -42
输出-42
解释
第 1 步 -42读入前导空格但忽视掉^
第 2 步 -42读入 - 字符所以结果应该是负数^
第 3 步 -42读入 42^
解析得到整数 -42 。
由于 -42 在范围 [-231, 231 - 1] 内最终结果为 -42 。示例 3
输入s 4193 with words
输出4193
解释
第 1 步4193 with words当前没有读入字符因为没有前导空格^
第 2 步4193 with words当前没有读入字符因为这里不存在 - 或者 ^
第 3 步4193 with words读入 4193由于下一个字符不是一个数字所以读入停止^
解析得到整数 4193 。
由于 4193 在范围 [-231, 231 - 1] 内最终结果为 4193 。提示
0 s.length 200s 由英文字母大写和小写、数字0-9、 、、- 和 . 组成
题解
public static int myAtoi(String str) {int len str.length();char[] charArray str.toCharArray();// 1、去除前导空格int index 0;while (index len charArray[index] ) {index;}// 2、如果已经遍历完成针对极端用例 if (index len) {return 0;}// 3、如果出现符号字符仅第 1 个有效并记录正负int sign 1;char firstChar charArray[index];if (firstChar ) {index;} else if (firstChar -) {index;sign -1;}// 4、将后续出现的数字字符进行转换// 不能使用 long 类型这是题目说的int res 0;while (index len) {char currChar charArray[index];// 4.1 先判断不合法的情况if (currChar 9 || currChar 0) {break;}// 题目中说只能存储 32 位大小的有符号整数下面两个if分别处理整数和负数的情况。// 提前判断乘以10以后是否越界,但res*10可能会越界所以这里使用Integer.MAX_VALUE/10这样一定不会越界。// 这是解决溢出问题的经典处理方式if (res Integer.MAX_VALUE / 10 || (res Integer.MAX_VALUE / 10 (currChar - 0) Integer.MAX_VALUE % 10)) {return Integer.MAX_VALUE;}if (res Integer.MIN_VALUE / 10 || (res Integer.MIN_VALUE / 10 (currChar - 0) -(Integer.MIN_VALUE % 10))) {return Integer.MIN_VALUE;}// 合法的情况下才考虑转换每一步都把符号位乘进去// 想想这里为什么要带着sign乘res res * 10 sign * (currChar - 0);index;}return res;}点击链接我正在「编程导航」和朋友们讨论有趣的话题你⼀起来吧 也可以加我QQ2837468248咨询说明来意