把字符串转换为整数(每日算法之把字符串转换成整数(atoi))
导读:JZ67 把字符串转换成整数(atoi 题目 写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成: 1.若干空格 2.(可选)一个符号字符(...
JZ67 把字符串转换成整数(atoi)
题目
写一个函数 StrToInt ,实现把字符串转换成整数这个功能 。不能使用 atoi 或者其他类似的库函数 。传入的字符串可能有以下部分组成: 1.若干空格 2.(可选)一个符号字符(+ 或 -) 3. 数字 ,字母 ,符号 ,空格组成的字符串表达式 4. 若干空格 转换算法如下: 1.去掉无用的前导空格 2.第一个非空字符为+或者-号时 ,作为该整数的正负号 ,如果没有符号 ,默认为正数 3.判断整数的有效部分: 3.1 确定符号位之后 ,与之后面尽可能多的连续数字组合起来成为有效整数数字 ,如果没有有效的整数部分,那么直接返回0 3.2 将字符串前面的整数部分取出 ,后面可能会存在存在多余的字符(字母 ,符号,空格等) ,这些字符可以被忽略 ,它们对于函数不应该造成影响 3.3 整数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数 ,使其保持在这个范围内 。具体来说 ,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1 4.去掉无用的后导空格方法 位运算
思路
算法实现
既然是将字符串转化为数字 ,那我们可以遍历字符串 ,一个字符串 ,一个字符地检查 ,然后取出掉无用的 ,取出数字 ,利用如下代码,一个数字一个数字地转换 ,前面的扩大十倍加上后面一位 。 res = res * 10 + sign * (c - 0); 具体做法: step 1:遍历字符串 ,用index记录全程的下标 。 step 2:首先要排除空串,然后越过前导空格 ,以及前导空格后什么都没有就返回0. step 3:然后检查符号 ,没有符号默认为正数 。 step 4:再在后续遍历的时候,将数字字符转换成字符 ,遇到非数字则结束转换 。 step 5:与Int型最大最小值比较 ,检查越界情况 。代码
package mid.JZ67把字符串转换成整数; import java.util.*; public class Solution { /** * 代码中的类名 、方法名 、参数名已经指定 ,请勿修改 ,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int StrToInt (String s) { // write code here if (s.isEmpty()) return 0; int res = 0; int index = 0; while(index < s.length()) { if (s.charAt(index) == ) index++; else break;; } //去掉空格就没了 if (index == s.length()) return 0; int sign = 1; //处理第一个符号是正负号的情况 if (s.charAt(index) == +) index++; else if (s.charAt(index) == -){ sign = -1; index++; } //去掉符号就什么都没有了 if(index == s.length()) return 0; while(index < s.length()) { char c = s.charAt(index); if (c < 0 || c > 9) { break; } //处理越界 if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (c - 0) > Integer.MAX_VALUE % 10)) return Integer.MAX_VALUE; if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (c - 0) > -(Integer.MIN_VALUE % 10))) return Integer.MIN_VALUE; res = res * 10 + sign * (c - 0); index++; } return res; } }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!