剑指Offer面试题49:把字符串换成整数
2016-10-10 21:19
387 查看
题目:把字符串换成整数
算法分析:
这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串”“,正负号,溢出等方方面面的测试用例都考虑到,并且在写代码的时候对这些特殊的输入都定义好合理的输出。当然,这些输出并不一定要和atoi完全保持一致,但必须要有显式的说明,和面试官沟通好。
这个应聘者最大的问题就是还没有养成在写代码之前考虑所有可能的测试用例的习惯,逻辑不够严谨,因此一开始的代码只处理了最基本的数值转换。后来我每次提醒他一处特殊的测试用例之后,他改一处代码。尽管他已经做了两次修改,但仍然有不少很明显的漏洞,特殊输入空字符串”“,边界条件比如最大的正整数与最小的负整数等。由于这道题思路本身不难,因此我希望他把问题考虑得极可能周到,代码尽量写完整。
算法源程序:
程序运行结果:
算法分析:
这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串”“,正负号,溢出等方方面面的测试用例都考虑到,并且在写代码的时候对这些特殊的输入都定义好合理的输出。当然,这些输出并不一定要和atoi完全保持一致,但必须要有显式的说明,和面试官沟通好。
这个应聘者最大的问题就是还没有养成在写代码之前考虑所有可能的测试用例的习惯,逻辑不够严谨,因此一开始的代码只处理了最基本的数值转换。后来我每次提醒他一处特殊的测试用例之后,他改一处代码。尽管他已经做了两次修改,但仍然有不少很明显的漏洞,特殊输入空字符串”“,边界条件比如最大的正整数与最小的负整数等。由于这道题思路本身不难,因此我希望他把问题考虑得极可能周到,代码尽量写完整。
算法源程序:
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 号:v1.0 * 题目描述:把字符串换成整数 * 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+,-,x,÷四则运算符号。 * 输入描述:无 * 程序输出:123 * 123 * -123 * 2147483647 * Exception in thread "main" -2147483647 * java.lang.NumberFormatException: +2147483648 * 问题分析: 无 * 算法描述:无 * 完成日期:2016-10-10 ***************************************************************/ package org.marsguo.offerproject49; public class StringToInt { 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'; //-‘0’实现了将字符转化为数字,index每加一位, if(tmp > 0x8000_0000L){ throw new NumberFormatException(num); } index++; } if(positive){ if(tmp >= 0x8000_0000L){ throw new NumberFormatException(num); }else{ result = (int) tmp; //如果是正数,返回tmp } } else{ if(tmp == 0x8000_0000L){ result = 0x8000_0000; } else{ result = (int) - tmp; //如果是负数,返回tmp前面加个- } } return result; } public static void main(String[] args){ System.out.println(stringToInt("123")); System.out.println(stringToInt("+123")); System.out.println(stringToInt("-123")); System.out.println(stringToInt("+2147483647")); System.out.println(stringToInt("-2147483647")); System.out.println(stringToInt("+2147483648")); System.out.println(stringToInt("-2147483648")); //System.out.println(stringToInt("LA123")); } }
程序运行结果:
相关文章推荐
- 剑指Offer:面试题49 把字符串转换成整数
- 剑指offer面试题49 把字符串转换成整数 (java实现)
- 【剑指Offer学习】【面试题49:把字符串转换成整数】
- 【剑指Offer学习】【面试题49:把字符串转换成整数】
- 剑指offer 面试题49 把字符串转换成整数
- 剑指Offer面试题49字符串转整数,面试题50二叉树两个结点的最低公共祖先
- 剑指offer 面试题49 把字符串转换成整数
- 剑指offer - 面试题49:把字符串转换为整数
- 【剑指Offer】面试题49:把字符串转化为整数
- 剑指offer面试题(49)把字符串转换成整数
- [剑指offer][面试题49]把字符串转换成整数(待完善)
- 剑指offer---把字符串转换为整数(49)
- 剑指offer——面试题:把字符串转换为整数
- 剑指Offer 49 把字符串转换成整数
- (C++)剑指offer-49:把字符串转换成整数(综合)
- 【剑指offer】题49:字符串转整数
- 【剑指offer】面试题67:把字符串转换成整数
- 剑指offer 面试题32—从1到n整数中1出现的次数
- 剑指offer--把字符串转换成整数
- 剑指offer 面试题11 求整数次幂