java字符转整形_java-字符串转整形

今天听室友说去京东面试,面试官出了一道算法题,说是让编程实现将字符串转成整形,室友大意了,跪在了算法上。故为室友写下了此文,希望能帮到同样在找工作的小伙伴们。

题目大意:

实现一个atoi函数,将字符串转成整形 。要点:考虑所有的输入情况。

解题思路:

【1】首先判断它是否为空,若是,直接返回相应的结果或者抛异常,(这里我选择抛异常,大家也可以约定好返回的结果值,记得注意区分就行)否则进行下面【2】的操作;

【2】判断输入字符串是否合法,首字母可以为符号位,其余位只能是数字;若不合法,直接返回约定好的值或者选择抛异常;

【3】到了该步,说明字符串合法,可以开始转换;

【4】判断计算的结果值是否溢出。

代码实现:

/**

* 字符串转整形。

*/

public class String2Integer {

public int string2int(String str) throws NumberFormatException{

int index = 0;//游标

boolean flag = true;//符号标记位,默认为true

long result = 0;//返回最终结果

//【1】首先判断它是否为空,若是,直接返回相应的结果或者抛异常,否则进行下面【2】的操作

if (str == null) {

throw new NumberFormatException("Invalid input string: null" + str);

}

if (str.length() == 0) {

throw new NumberFormatException("Invalid input string,the length is : " + str.length());

}

//【2】判断输入字符串是否合法

if (!isLegal(str)) {

throw new NumberFormatException("Invalid input string:" + str);

}

//【3】到了该步,说明字符串合法,可以开始转换

if (str.charAt(0) == '-' || str.charAt(0) == '+') {

result = convert(str.substring(1));

}else {

result = convert(str);

}

if (result > 0 && str.charAt(0) == '-') result = -result;

if (result < Integer.MIN_VALUE) {

throw new NumberFormatException("Invalid input string: Underflow");

}

return (int) result;

}

/**

* 将合法的字符串进行转化成整形。

* @param str

* @return

*/

private long convert(String str) {

long result = 0;

for (int i = 0; i < str.length(); i++) {

result = result * 10 + (str.charAt(i) - '0');

if (result > Integer.MAX_VALUE) {

throw new NumberFormatException("Invalid input string: Overflow");

}

}

return result;

}

/**

* 判断字符串是否合法。

*

* @param str

* @return

*/

private boolean isLegal(String str) {

boolean flag = false;

char c = str.charAt(0);//首字符

//只有一个字符且为非法字符

if (str.length() == 1 ) {

if (c <= '0' && c >= '9') {

throw new NumberFormatException("Invalid input string: " + str);

}else {

return true;

}

}else {//从第二个字母开始判断是否为数字

for (int i = 1; i < str.length(); i++) {

if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {

flag = true;

} else {

flag = false;

return flag;

}

}

}

return flag;

}

}

/**

测试用例

*/

import com.lm.main.String2Integer;

import org.junit.Test;

import static org.junit.Assert.*;

public class String2IntegerTest extends String2Integer {

@Test

public void string2int() throws Exception {

String2Integer string2Integer = new String2IntegerTest();

assertEquals(123456, string2Integer.string2int("123456"));

assertEquals(-123456, string2Integer.string2int("-123456"));

assertEquals(0, string2Integer.string2int("0"));

}

}

感想:

此题看似简单,其实主要考察大家考虑问题是否全面细心,这也是作为一名合格的程序猿所必备的一项技能。此外,leetcode上有关于这道题的有奖征答,奖励100美金哦,欢迎诸位大神指教。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值