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美金哦,欢迎诸位大神指教。

你可能感兴趣的:(java-字符串转整形)