剑指offer——字符串转数字(奥妙各种)(没有考虑科学计数法的情况)(好题)
2017-07-01 15:15
239 查看
题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
思路:
把String变成charArray,然后挨个对char元素分解,并判断是否是正确的数字。除了正负号和数字以外的所有字符,如果检测到直接break , 正负号没有出现在0号位,也是错误字符串。
?最高位是0,但前面有个加号或者减号,算是正确表达么?
加号的ascii码是43,减号是45
虽然过了OJ,但是有没考虑到的情况,比如整数类型可能会溢出。
溢出时,正负号会改变,以此判断溢出。
用下面的方法求和也可以!
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
思路:
把String变成charArray,然后挨个对char元素分解,并判断是否是正确的数字。除了正负号和数字以外的所有字符,如果检测到直接break , 正负号没有出现在0号位,也是错误字符串。
?最高位是0,但前面有个加号或者减号,算是正确表达么?
加号的ascii码是43,减号是45
public class Solution { public int StrToInt(String str) { char[] s = str.toCharArray(); int result = 0; if(s.length==0) return 0; int i = s.length-1; for(; i>=1; i--){ if((s[i]-'0')>=0&&(s[i]-'0')<=9) result += (int)Math.pow(10,s.length-(i+1))*(s[i]-'0'); else break; } if(i>1) return 0; if((s[i]-'0')>0&&(s[i]-'0')<=9){ result += (int)Math.pow(10,s.length-1)*(s[0]-'0'); return result; } else if((s[i]-'0')==0&&s.length==1) return 0; else if(s[i]==45) // 直接s[i] = '-' 就好了... return result*-1; else if(s[i]==43) return result; return 0; } }
虽然过了OJ,但是有没考虑到的情况,比如整数类型可能会溢出。
溢出时,正负号会改变,以此判断溢出。
if((s[i]-'0')>=0&&(s[i]-'0')<=9) { int temp = (int) Math.pow(10, s.length - (i + 1)) * (s[i] - '0') + result; if(temp*result<0) //说明溢出了 return 0; else result = temp; }
用下面的方法求和也可以!
for (int i = start; i < chars.length; i++) { result = result * 10 + (int) (chars[i] - '0'); }
相关文章推荐
- 提取字符串中的数字,如''123" ,结果123,考虑各种情况
- 剑指offer题解 把字符串转换成整数(todo:考虑大整数的情况)
- 剑指offer之字符串转换为数字
- 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
- 我用c#写了一个测试样例,分析了int,char,datetime和varchar的日志情况而且没有考虑null和空字符串的保存,希望感兴趣的朋友能和我一起交流打造属于自己的日志分析工具
- 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
- 剑指Offer_46 把数字翻译成字符串
- 剑指offer面试题54 表示数字的字符串(java实现)
- 剑指Offer面试题:35.将字符串转换为数字
- 剑指offer-将字符串转化为数字
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 剑指offer_表示数字的字符串
- 用字符串实现大数的相加,没有考虑存在负数的情况
- 剑指offer-字符串转化为数字
- 剑指offer:把字符串转换成数字
- 剑指offer——字符串转数字
- 剑指Offer-46:把数字翻译成字符串
- 递归解决输出一个字符串的全排列问题(缺陷:没有考虑字符串中字符重复的问题)
- 【九度OJ1351】|【剑指offer40】数组中只出现一次的数字
- 整形数字和字符串数字的索引使用情况