关闭

【剑指Offer学习】【面试题49:把字符串转换成整数】

标签: 字符串offerjava面试算法
2300人阅读 评论(1) 收藏 举报
分类:

题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。


题目解析

  这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串”“,正负号,溢出等方方面面的测试用例都考虑到,并且在写代码的时候对这些特殊的输入都定义好合理的输出。当然,这些输出并不一定要和atoi完全保持一致,但必须要有显式的说明,和面试官沟通好。
  这个应聘者最大的问题就是还没有养成在写代码之前考虑所有可能的测试用例的习惯,逻辑不够严谨,因此一开始的代码只处理了最基本的数值转换。后来我每次提醒他一处特殊的测试用例之后,他改一处代码。尽管他已经做了两次修改,但仍然有不少很明显的漏洞,特殊输入空字符串”“,边界条件比如最大的正整数与最小的负整数等。由于这道题思路本身不难,因此我希望他把问题考虑得极可能周到,代码尽量写完整。

代码实现

public class Test49 {

    /**
     * 题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,
     * 不能使用atoi或者其他类似的库函数。
     *
     * @param num
     * @return
     */
    public static int stringToInt(String num) {

        if (num == null || num.length() < 1) {
            throw new NumberFormatException(num);
        }

        char first = num.charAt(0);
        if (first == '-') {
            return parseString(num, 1, false);
        } else if (first == '+') {
            return parseString(num, 1, true);
        } else if (first <= '9' && first >= '0') {
            return parseString(num, 0, true);
        } else {
            throw new NumberFormatException(num);
        }
    }

    /**
     * 判断字符是否是数字
     *
     * @param c 字符
     * @return true是,false否
     */
    private static boolean isDigit(char c) {
        return c >= '0' && c <= '9';
    }

    /**
     * 对字符串进行解析
     *
     * @param num      数字串
     * @param index    开始解析的索引
     * @param positive 是正数还是负数
     * @return 返回结果
     */
    private static int parseString(String num, int index, boolean positive) {

        if (index >= num.length()) {
            throw new NumberFormatException(num);
        }

        int result;
        long tmp = 0;
        while (index < num.length() && isDigit(num.charAt(index))) {
            tmp = tmp * 10 + num.charAt(index) - '0';
            // 保证求的得的值不超出整数的最大绝对值
            if (tmp > 0x8000_0000L) {
                throw new NumberFormatException(num);
            }
            index++;
        }

        if (positive) {
            if (tmp >= 0x8000_0000L) {
                throw new NumberFormatException(num);
            } else {
                result = (int) tmp;
            }
        } else {
            if (tmp == 0x8000_0000L) {
                result = 0x8000_0000;
            } else {
                result = (int) -tmp;
            }
        }

        return result;
    }

    public static void main(String[] args) {
//        System.out.println(Integer.parseInt(Integer.MIN_VALUE + ""));
//        System.out.println(0x8000_0000L);
//        System.out.println(stringToInt(""));
        System.out.println(stringToInt("123"));
        System.out.println(stringToInt("+123"));
        System.out.println(stringToInt("-123"));
        System.out.println(stringToInt("1a123"));
        System.out.println(stringToInt("+2147483647"));
        System.out.println(stringToInt("-2147483647"));
        System.out.println(stringToInt("+2147483648"));
        System.out.println(stringToInt("-2147483648"));
//        System.out.println(stringToInt("+2147483649"));
//        System.out.println(stringToInt("-2147483649"));
//        System.out.println(stringToInt("+"));
//        System.out.println(stringToInt("-"));
    }

}

运行结果

这里写图片描述

2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【剑指offer-Java版】49把字符串转换为整数

字符串转换为整数 : atoi可能的输入: 1 带符号数 2 无符号数 3 零 4 空指针 5 超出表示范围 – 暂时仅仅是直接退出且设置最小 – 可以考虑此时抛个异常 6 非法输入,比如...
  • Sugar_Z_
  • Sugar_Z_
  • 2016-04-27 09:48
  • 869

《剑指Offer》面试题:将字符串转换为整数

题目 题目:把字符串转化为整数 ,若输入无效,则返回0且将标志位设为true 自己以前在一些书上面看到过关于 字符串转化为整数的例子,心中有点印象,知道要考虑一些特殊情况。今天决定写下这段代码,...
  • u010412719
  • u010412719
  • 2015-08-30 20:02
  • 1502

剑指offer面试题28:字符串的排列 Java实现

题目: 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba. 算法分析: 我们求...
  • gg543012991
  • gg543012991
  • 2016-09-14 19:42
  • 596

【剑指Offer学习】【面试题54:表示数值的字符串】

题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例子说明  例如,字符串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示数值,但“12e”,”1a3....
  • DERRANTCM
  • DERRANTCM
  • 2015-07-10 08:14
  • 2697

剑指offer--面试题28:字符串的排列--Java实现

题目描述:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。解题思路:我们求整个字符...
  • u012289407
  • u012289407
  • 2015-06-28 16:55
  • 1563

【剑指Offer学习】【所有面试题汇总】

剑指Offer学习  剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流!目录第...
  • DERRANTCM
  • DERRANTCM
  • 2015-07-15 07:26
  • 18450

剑指offer-面试题28.字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba.   此题的主要步骤由如...
  • u013018721
  • u013018721
  • 2016-04-08 12:52
  • 436

剑指offer之面试题12-1:大整数加减

题目描述定义一个函数,在该函数中可以实现任意两个整数的加法。由于没有限定输入两个数的大小范围,我们也要把它当做大数问题来处理思路: s1:用两个字符数组分别来保存两个数 case1:两个数一正一负...
  • sushauai
  • sushauai
  • 2016-04-21 19:34
  • 537

剑指offer面试题14

面试题14:调整数组顺序使奇数位于偶数t
  • ahuang1900
  • ahuang1900
  • 2014-05-29 17:29
  • 399

剑指offer--面试题22:栈的压入、弹出序列--Java实现

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假如压入栈的所有数字均不相同。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该栈序列...
  • u012289407
  • u012289407
  • 2015-06-19 21:12
  • 433
    个人资料
    • 访问:1018581次
    • 积分:16133
    • 等级:
    • 排名:第756名
    • 原创:527篇
    • 转载:18篇
    • 译文:13篇
    • 评论:206条
    博客专栏
    最新评论