LeetCode题解 #8 String to Integer (atoi)
又是一道恶心的简单题。
一开始没想到这么多情况的,幸好LeetCode是个很人性化的oj,能让你知道你在哪个case上错了,否则一辈子都过不了。
考虑不周到只能一个个补了。
列举一下恶心的case
//" 010"
//" +004500"
//" -0012a42"
//"2147483648"
//" b11228552307"
//"18446744073709551617"
//" r11384376420"
所有要注意的情况是:
- 字符串前置的空格需要清除;//读掉所有空格
- 无视前导0
- 数字前最多允许1个"+"或"-",出现多个时返回0;
- 数字中出现不为数字的符号时即认为数字结束,比如"252ab","252-2","252 09"都判定为252;//找到第一个非数字的地方
- 数字大于INT_MAX时,返回INT_MAX,小于INT_MIN时,返回INT_MIN。
其实没有考到什么算法,就是if else而已
一开始的代码(觉得有必要贴出来,让以后的自己看看-_-)
public static int myAtoi(String str) {
long temp = 0;
//空白
if(str.length()==0)
return 0;
//非数字
//单个数字
else if(str.length()==1){
//System.out.println((int)str.charAt(0)-48);
if(48<=str.charAt(0)&&str.charAt(0)<=57)
return (int)str.charAt(0)-48;
else
return 0;
}
//多个数字
else{
//读掉开头的空格
int start = 0;
for(start=0;start<str.length();start++)
if(str.charAt(start)!=' ')
break;
if(start==str.length()){
System.out.println("all blank");
return 0;
}
//除开头外判断是否全是数字
//找到非数字的地方
int end = 0;
for(end=start+1;end<str.length();end ++)
if(!(48<=str.charAt(end)&&str.charAt(end)<=57)){
System.out.println(str.charAt(start));
System.out.println("not num");
System.out.println("end-->"+end);
break;
}
if(!(48<=str.charAt(start)&&str.charAt(start)<=57)&&!(48<=str.charAt(start+1)&&str.charAt(start+1)<=57)){
System.out.println("not num");
return 0;
}
if(str.charAt(start)=='+'){
System.out.println(str.charAt(start));
if(end-start>=13)
return 2147483647;
if(start+1==end-1)
return ((int)str.charAt(start+1)-48);
for(int i=start+1;i<end;i++){
//System.out.println("temp--->"+temp);
//System.out.println((int)str.charAt(i)-48);
if(str.charAt(i)==' ')
continue;
temp = temp*10+((int)str.charAt(i)-48);
//System.out.println("now --->"+temp);
}
//System.out.println(temp);
System.out.println("zhengshu1");
if(temp>=2147483647)
return 2147483647;
if(temp<=-2147483648)
return 2147483647;
return (int)temp;
}
else if(str.charAt(start)=='-'){
if(start+1==end-1)
return -((int)str.charAt(start+1)-48);
if(end-start>=13)
return -2147483648;
for(int i=start+1;i<end;i++){
//System.out.println("temp--->"+temp);
//System.out.println((int)str.charAt(i)-48);
if(str.charAt(i)==' ')
continue;
temp = temp*10+((int)str.charAt(i)-48);
//System.out.println("now --->"+temp);
}
System.out.println(temp);
temp = -temp;
System.out.println("fushu");
if(temp>=2147483647)
return -2147483648;
if(temp<=-2147483648){
System.out.println("fushu min ");
return -2147483648;
}
return (int)temp;
}
else{
System.out.println(start-end);
if(end-start>=13)
return 2147483647;
System.out.println(str.charAt(start));
System.out.println(end);
if(!(48<=str.charAt(start)&&str.charAt(start)<=57))
return 0;
if(start==end-1)
return ((int)str.charAt(start)-48);
for(int i=start;i<end;i++){
//System.out.println("temp--->"+temp);
//System.out.println((int)str.charAt(i)-48);
if(str.charAt(i)==' ')
continue;
temp = temp*10+((int)str.charAt(i)-48);
//System.out.println("now --->"+temp);
}
System.out.println(temp);
System.out.println("zhengshu2");
if(temp>=2147483647)
return 2147483647;
if(temp<=-2147483648)
return 2147483647;
return (int)temp;
}
}
}
以下是综合了所有情况但是高度简洁的代码:
int myAtoi(string str) {
int length = str.size();
long long ret_64 = 0;
int op = 1; int p = 0;
while (str[p] == ' ') ++p;
if (str[p] == '+' || str[p] == '-')
{ if (str[p] == '-') op = -1; p++; }
for (int i = p; i < length; ++i)
if ('0' <= str[i] && str[i] <= '9')
{ ret_64 = ret_64 * 10 + (str[i] - '0');
if ((op == -1 && ret_64 > 2147483648LL))
return -2147483648;
if ((op == 1 && ret_64 > 2147483647LL))
return 2147483647; }
else
break;
return (int)ret_64 * op; }
总结一下:
没有技巧可言,就是常见的判断溢出(用long),一个个构建起一个数字(temp = temp*10+((int)str.charAt(i)-48);),字符转数字用ASCII码。
LeetCode题解 #8 String to Integer (atoi)的更多相关文章
- 《LeetBook》leetcode题解(8): String to Integer (atoi) [E]——正负号处理
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- 【LeetCode】8. String to Integer (atoi) 字符串转换整数
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,P ...
- 【一天一道LeetCode】#8. String to Integer (atoi)
一天一道LeetCode系列 (一)题目 Implement atoi to convert a string to an integer. Hint: Carefully consider all ...
- 【LeetCode】008. String to Integer (atoi)
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
- 【LeetCode】8. String to Integer (atoi) 字符串转整数
题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...
- 【leetcode】8. String to Integer (atoi)
题目描述: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ...
- LeetCode(8) - String to Integer (atoi)
虽然是easy,却是比较繁琐的一道题,需要考虑各种边界条件.在WA了好几遍之后,才把各种边界条件给补全.需要考虑到的因素如下: 输入不合法字符,非"0-9",对于首位,合法字符还包 ...
- leetcode day6 -- String to Integer (atoi) && Best Time to Buy and Sell Stock I II III
1. String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully con ...
- Kotlin实现LeetCode算法题之String to Integer (atoi)
题目String to Integer (atoi)(难度Medium) 大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理. 方案1 class ...
随机推荐
- 线性回归 Linear regression(2)线性回归梯度下降中学习率的讨论
这篇博客针对的AndrewNg在公开课中未讲到的,线性回归梯度下降的学习率进行讨论,并且结合例子讨论梯度下降初值的问题. 线性回归梯度下降中的学习率 上一篇博客中我们推导了线性回归,并且用梯度下降来求 ...
- 【错误】More than one row with the given identifier was found: 1, for class:
问题原因: 数据库测试数据自己填入,两条数据的id都为1,所以报错 问题解决: 找到数据库表 删除全部数据
- BZOJ3277 串 【广义后缀自动机】
Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Input 第一行两个整数n, ...
- BestCoder Round #1 第二题 项目管理
// 第二题 我记得很久很久很久以前看过这样的题目,忘记是哪的区域赛了 // 记得有人说和节点度数有关,我记不清了,反正当时完全不懂 // 然后我想了想,估计就是更新节点度数有关,YY出来可能只要更新 ...
- ubnut16.4 下 设置静态ip
一.编辑interfaces sudo vi /etc/network/interface ### i 键进入编辑 二.编辑该文件 auto loiface lo inet loopbackauto ...
- hapi lab测试框架简单使用
1. 依赖安装 yarn init yarn add lab code 2. 基本模式 const Lab = require('lab'); const Code = require('code') ...
- ZBar的简单使用
NSRunLoop类声明的编程接口用于管理输入源对象.一个NSRunLoop对象处理像来自窗体系统中的鼠标和键盘事件,NSPORT对象和NSConnection连接对象这类的输入源.一个NSRunLo ...
- Java变量类型之间的转换
int i; String s="134"; 1)String转换成int i=Integer.parseInt(s); 2)int转换成String(其他类型转String,都可 ...
- Mongodb简单介绍安装
具体详细内容,请查阅 Mongodb官方文档 一.简单介绍 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. M ...
- Hadoop序列化与Writable接口(一)
Hadoop序列化与Writable接口(一) 序列化 序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储:相对的反序列化(deserial ...