【LeetCode】String to Integer (atoi) 解题报告
这道题在LeetCode OJ上难道属于Easy。可是通过率却比較低,究其原因是须要考虑的情况比較低,非常少有人一遍过吧。
【题目】
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
spoilers alert... click to show requirements for atoi.
The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed
by as many numerical digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.
If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.
【解析】
我预计没有多少人不看以下的要求就通过的吧!
这道题要求的 atoi 跟C++实现的不一样吧。比方我以为不符合要求的返回-1,而这道题要求返回0。
所以,有必要解释一下题目的要求:
1. 首先须要丢弃字符串前面的空格;
2. 然后可能有正负号(注意仅仅取一个,假设有多个正负号。那么说这个字符串是无法转换的,返回0。比方測试用例里就有个“+-2”);
3. 字符串能够包括0~9以外的字符,假设遇到非数字字符,那么仅仅取该字符之前的部分,如“-00123a66”返回为“-123”;
4. 假设超出int的范围,返回边界值(2147483647或-2147483648)。
综上,要求还是有点怪的,不看要求是非常难写对的,看了也不一定理解的对。
【Java代码】
public class Solution {
public int atoi(String str) {
// 1. null or empty string
if (str == null || str.length() == 0) return 0;
// 2. whitespaces
str = str.trim();
// 3. +/- sign
boolean positive = true;
int i = 0;
if (str.charAt(0) == '+') {
i++;
} else if (str.charAt(0) == '-') {
positive = false;
i++;
}
// 4. calculate real value
double tmp = 0;
for ( ; i < str.length(); i++) {
int digit = str.charAt(i) - '0';
if (digit < 0 || digit > 9) break;
// 5. handle min & max
if (positive) {
tmp = 10*tmp + digit;
if (tmp > Integer.MAX_VALUE) return Integer.MAX_VALUE;
} else {
tmp = 10*tmp - digit;
if (tmp < Integer.MIN_VALUE) return Integer.MIN_VALUE;
}
}
int ret = (int)tmp;
return ret;
}
}
參考 http://www.programcreek.com/2012/12/leetcode-string-to-integer-atoi/ ,代码例如以下:
public int atoi(String str) {
if (str == null || str.length() < 1)
return 0;
// trim white spaces
str = str.trim();
char flag = '+';
// check negative or positive
int i = 0;
if (str.charAt(0) == '-') {
flag = '-';
i++;
} else if (str.charAt(0) == '+') {
i++;
}
// use double to store result
double result = 0;
// calculate value
while (str.length() > i && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
result = result * 10 + (str.charAt(i) - '0');
i++;
}
if (flag == '-')
result = -result;
// handle max and min
if (result > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
if (result < Integer.MIN_VALUE)
return Integer.MIN_VALUE;
return (int) result;
}
代码看起来更简洁,可是第一种写法能够及时跳出循环。不用计算完了再推断是否越界。
【LeetCode】String to Integer (atoi) 解题报告的更多相关文章
- LeetCode: String to Integer (atoi) 解题报告
String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...
- 【LeetCode】397. Integer Replacement 解题报告(Python)
[LeetCode]397. Integer Replacement 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/inte ...
- [LeetCode] String to Integer (atoi) 字符串转为整数
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- [Leetcode] String to integer atoi 字符串转换成整数
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- [LeetCode] String to Integer (atoi) 字符串
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- 【LeetCode】343. Integer Break 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学解法 动态规划 日期 题目地址:https:// ...
- [Leetcode]String to Integer (atoi) 简易实现方法
刚看到题就想用数组做,发现大多数解也是用数组做的,突然看到一个清新脱俗的解法: int atoi(const char *str) { ; int n; string s(str); istrings ...
- [LeetCode]String to Integer (atoi)
题意:字符串转正数 原题来自:https://leetcode.com/problems/string-to-integer-atoi/ 分析: <程序员面试宝典>上出现的面试题,主要是考 ...
- leetcode String to Integer (atoi) python
class Solution(object): def myAtoi(self, str): """ :type str: str :rtype: int "& ...
随机推荐
- 关于面试总结1-SQL学生表
前言 每次面试必考SQL,小编这几年一直吃SQ的亏,考题无非就是万年不变学生表,看起来虽然简单,真正写出来,还是有一定难度.于是决定重新整理下关于SQL的面试题,也可以帮助更多的人过SQL这一关. 作 ...
- Android之用自定义的shape去实现shadow效果
直接上xml文件, 并且附上相应的解析: <?xml version="1.0" encoding="utf-8"?> <selector x ...
- 低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode
之前我一直用ActionBarSherlock这个开源项目来做ActionBar,因为它可以让低版本的设备也能用上ActionBar.但是在最新的SDK中Google提供了一个AppCompa ...
- 《RESTful Web APIs中文版》
<RESTful Web APIs中文版> 基本信息 原书名:RESTful Web APIs 原出版社: O'Reilly Media 作者: Leonard Richardson ...
- Java Callable接口与Future接口的两种使用方式
Java Callable.Future的两种使用方式Callable+Futurepublic class Test { public static void main(String[] args) ...
- Photoshop 使用阈值调整色阶
1. 阈值原理 阈值的定义其实就是“临界点”,即过了这个临界点是一种情况(比如黑色),没有超过这个临界点是另外一种情况(比如白色),所以图像上只有黑.白两种情况出现.临界点的值由你定义: 阈值实际应用 ...
- 关于XSHM(Cross-Site History Manipulation)
http://blog.chinaunix.net/uid-27070210-id-3255407.html 乍一看,好像和以前 css history hack 差不多,其实原理还是不一样的.浏览器 ...
- frp错误处理:login to server failed: authorization failed
frp使用过程中会出现各种错误信息,有些朋友不太清楚,打算记录一些常见的错误返回代码,这里介绍一下frpc客户端[W] [control.go:111] login to server failed: ...
- linux top命令看到的实存(RES)与虚存(VIRT)分析
近期在公司中解决程序使用的内存高问题,将一部分之前无法回收的内存进行了回收,实现降内存效果(降实存). 在统计效果时, QA问是统计RES(实存)还是VIRT(虚存). 在网上学习看了一些博客,这里自 ...
- C/C++ signal 信号处理函数
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号. 内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件. 注意,信号只 ...