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


题目解析

  这看起来是非常easy的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。

但是,当我们要把非常多特殊情况即測试用例都考虑进去。却不是件easy的事。

解决数值转换问题本身并不难,但我希望在写转换数值的代码之前。应聘者至少能把空指针。空字符串”“。正负号,溢出等方方面面的測试用例都考虑到,而且在写代码的时候对这些特殊的输入都定义好合理的输出。当然。这些输出并不一定要和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("-"));
} }

执行结果

【剑指Offer学习】【面试题49:把字符串转换成整数】的更多相关文章

  1. 《剑指offer》面试题67. 把字符串转换成整数

    问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数.   首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...

  2. 剑指offer四十九之把字符串转换成整数

    一.题目 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 二.思路 详见代码. 三.代码 public class Solution { ...

  3. 《剑指offer》面试题28:字符串的排列(牛客网版本) java

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  4. 【剑指offer】面试题 49. 丑数

    面试题 49. 丑数 题目描述 题目:把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺 ...

  5. (剑指Offer)面试题49:把字符串转换为整数

    题目: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 思路: 考虑+.-.空格.非数字字符,以及溢出问题 代码: #include <iostream> using n ...

  6. 《剑指offer》面试题49. 丑数

    问题描述 我们把只包含因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5 ...

  7. (剑指Offer)面试题28:字符串的排列

    题目: 输入一个字符串,打印出该字符串中字符的所有排列. 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 思路: 把一个字符串看 ...

  8. 【剑指offer】面试题28:字符串的排列

    题目: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入一 ...

  9. 剑指Offer 49. 把字符串转换成整数 (字符串)

    题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...

  10. [剑指Offer] 49.把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0  [思路]考虑所有特殊情况 1.数字前面有空格,如s="    12 ...

随机推荐

  1. [HNOI2012]矿场搭建(割点)

    [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出 ...

  2. HTML5学习笔记简明版(11):新增的API

    HTMLDocument上的扩展 HTML5在DOM Level 2 HTML上扩展了一些HTMLDocument的接口.这些接口在全部实现了Document接口的元素对象上进行了实现. HTML5在 ...

  3. [递推+dfs]ZOJ 3436. July Number

    题目大意: 将一个数字的相邻两位的差(的绝对值)组成一个新的数字.不断反复.假设最后得到7,就称这个数为July Number,比方9024 – 922 – 70 – 7. 题目要求1e9范围内给定区 ...

  4. vim插件之marks

    最近在看源码的过程中,发现一点很不方便的地方,就是当我在几个相关的类来回跳转的时候,之前定位的关键代码很容易找不到,结果进程需要重复查找关键点.虽然当时想到了可以通过marks来标志,但是,因为mar ...

  5. sp_executesql invalid object name

    https://stackoverflow.com/questions/10417126/dynamically-named-temp-table-returns-invalid-object-nam ...

  6. json的键为变量而不是字符串时,怎么写?

    看栗子 /* 首先你创建了一个window的属性叫b, 并给它赋值为'cccddd' * 然后你创建了一个对象"a", 声明了一个它的属性叫b, 并且给b赋值为6 * 注意第一行的 ...

  7. 手动删除oracle数据库

    --===================== -- 手动删除oracle数据库 --===================== 杀掉进程用此方法比较好,能保证杀得干净,而不是用sql 里面的语句ki ...

  8. JAVA工程命名规范

    Java推荐的包声明命名约定是反向域名. 例如 - com.abysm.myproject

  9. Jsp学习总结(1)——JSP九大内置对象和四种属性范围解读

    一.四种属性范围 1.1.在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效 request:在一次服务请求范围内,服务器跳转后依然有效 session:-在一次会话范围内 ...

  10. CSUOJ 1542 Flipping Parentheses

    ACM International Collegiate Programming Contest Asia Regional Contest, Tokyo, 2014–10–19 Problem G ...