String to Integer (atoi)

字符串转整数ATOI实现
本文介绍了一种实现字符串转整数ATOI的方法,详细解释了如何处理各种输入情况,包括非法输入和边界条件。文章还提供了完整的代码示例,并讨论了相关的关键技术点。
[size=large][color=darkred][b]题目描述[/b][/color][/size]
Implement atoi to convert a string to an integer.

[b]Hint:[/b] Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

[b]Notes: [/b]It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
题目出处:[url]https://oj.leetcode.com/problems/string-to-integer-atoi/[/url]

[size=large][color=darkred][b]解题思路[/b][/color][/size]
本题实现字符串转换为整数的函数。

[size=large][color=darkred][b]相关知识点[/b][/color][/size]
[b][size=medium](1)根据下标删除字符串中的字符[/size][/b]
String中并没有相应的函数,处理的方法是使用StringBuffer。
StringBuffer sb = new StringBuffer(str);
sb.deleteCharAt(0);//删除下标为0的字符


[size=medium][b](2)String中的subString(int beginIndex, int endIndex)的方法中endIndex参数并不包括在内,也就是说是从beginIndex到endIndex-1。[/b][/size]

[size=medium][b](3)String中compareTo(String anotherString)中的比较规则是不管长度大小,总是从第一个字符开始比较,如果相同则返回0,大于或者小于返回两个的差值(一个大于0,一个小于0)。[/b][/size]

[size=medium][color=darkred][b]自己的代码[/b][/color][/size]
package leetcode;

public class StringToIntegerAtoi {
public int atoi(String str) {
if(str == null) return 0;
//将头部的空格去掉
StringBuffer sb = new StringBuffer(str);
for(int i = 0; i < sb.length(); i++){
if(sb.charAt(i) == ' ') {
sb.deleteCharAt(i);
i = -1;
}
else break;
}
str = sb.toString();
if(str.length() == 0) return 0;
//判断首字符是否为“ + - 数字”
int sign = 1;
char firChar = str.charAt(0);
if(firChar != '+' && firChar != '-' && !(firChar >= '0' && firChar <= '9'))
return 0;
if(firChar == '-' || firChar == '+'){
if(str.length() == 1) return 0;
else if(firChar == '-') sign = 0;
str = str.substring(1);
}
//判断字符中是否全为数字,然后将非数字字符前的数字全部提取出来
for(int i = 0; i < str.length(); i ++){
char curChar = str.charAt(i);
if(!(curChar >= '0' && curChar <= '9')) {
if(i == 0) return 0;
else {
str = str.substring(0, i);
break;
}
}
}
//判断是否越界
if(str.length() > 10 && sign == 1) return 2147483647;
if(str.length() > 10 && sign == 0) return -2147483648;
if(str.length() == 10 && str.compareTo("2147483647") >= 0 && sign == 1) return 2147483647;
else if(str.length() == 10 && str.compareTo("2147483648") >= 0 && sign == 0) return -2147483648;

int sum = 0;
int power = 0;
for(int i = str.length() - 1; i >= 0; i--, power++){
sum += (str.charAt(i)-'0')*Math.pow(10, power);
}
if(sign == 0) sum = 0 - sum;

return sum;
}

public static void main(String[] args) {
//String str = null;
//String str = "";
//String str = "+";
//String str = "-";
//String str = "+1";
//String str = "+12";
//String str = "-1";
//String str = "-12";
//String str = "1";
//String str = "12";
//String str = "+-1";
//String str = "010";
//String str = " 010";
//String str = " -0012a42";
//String str = "-2147483648";
//String str = "-2147483649";
//String str = "23a8f";
String str = " -11919730356x";

StringToIntegerAtoi stia = new StringToIntegerAtoi();
System.out.println(stia.atoi(str));
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值