java-字符串转整形

作者: Ferrari1001 | 来源:发表于2018-03-24 23:54 被阅读12次

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

    题目大意:

        实现一个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-字符串转整形

        本文链接:https://www.haomeiwen.com/subject/gznqcftx.html