Day49:将字符串转换成整数
剑指Offer_编程题——将字符串转换成整数
题目描述:
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入: +2147483647 1a33 输出: 2147483647 0
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体实现
思路一:
- 将输入的字符串转换成字符数组。从大下标开始,反向对每个字符逐个处理。
- 若当前字符的ASII码在[48-57],注意是闭区间。则代表当前字符是[0~9],继续判断下一个。
- 当遍历到下标为0的字符时,需要进行特殊情况的几个判断。包括是否越界,是否是临界值,是否为负号等。 接下来我们用Java实现其思路:
public class Solution{
public int StrToInt(String str){
if(str == null || str.length() == 0){
return 0;
}
int result = 0;
char[] chs = str.toCharArray();
int len = chs.length;
for(int i = len - 1, j = 0; i > 0; i--, j++){
int c = (int) chs[i];
if(c < 48 || c > 57){
return 0;
}else{
result += (c - 48)*Math.pow(10, j);
}
}
int c = (int)chs[0];
if (c <= 57 && c >= 48){
result +=
(c - 48) * Math.pow(10, len - 1);
}
if(result < -2147483648 || result > 2147483647){
return 0;
}else if(str.equals("2147483648")){
if(c == 45){
result = -2147483648;
}
}else if(str.equals("-2147483648")){
result = -2147483648;
}else{
if (c == 45){
result = -result;
}
}
return result;
}
}
代码效果图如图所示:
思路二: 1、 先判断首字符是否为负号。 2、 判断当前字符是否表示数字。 3、 (res << 1) + (res << 3) 即 res2+res8=res*10 4、[0-9]的二进制表示低四位刚好就是[0~9]。 (chs[i] & 0xf)即取低四位值。 接下来我们用java和python实现。 1、首先我们用java实现:
public class Solution{
public int StrToInt(String str){
if(str == null || str.length() == 0){
return 0;
}
int n = str.length(), s= 1;
char[] chs = str.toCharArray();
int res = 0;
if(chs[0] == '-')
s = -1;
for(int i = (chs[0] == '-' || chs[0] == '+') ? 1 : 0; i < n; ++i){
if(!('0' <= chs[i] && chs[i] <= '9'))
return 0;
res = (res << 1) + (res << 3) + (chs[i] & 0xf);
}
return (int) res*s;
}
}
代码效果图如图所示:
2、接下来我们用python实现:
class Solution:
def StrToInt(self, s):
if len(s) == 0 or s == "":
return 0
s = list(s)
j = 0
flag = True
if s[0] == '-' or s[0] == '+':
j = 1
if s[0] == '-':
flag = False
sum = 0
for i in range(j, len(s)):
if ord(s[i]) < 48 or ord(s[i]) > 57:
return 0
sum = sum * 10 + (ord(s[i]) - 48)
if flag == False:
return sum*(-1)
else:
return sum
代码效果图如图所示:
总结
本题是主要考察字符串转化为整数,本题较为简单,不过需要我们注意的是int整型数据类型的范围,也就是在java中要考虑其溢出的情况。但是由于python中没有int这一类型,因此不存在溢出的情况,只需要考虑数字以及±*/这些运算符号的ASCII码。本道题我们应用了两种方法将其实现,首先就是将其存在数组里面,然后从右往左进行遍历,转换。另一种就是先判断负号,在进行判断是否为数字,并且通过java以及python两种方式将其实现。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] ouyangyanlan [2] 天举的博客
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WPF SharpDx 性能优化方法
- java中的reference(四): WeakReference的应用--ThreadLocal源码分析
- 聊聊dubbo-go的availableCluster
- 删除排序链表中重复元素的方法
- java异常体系及1.7中的try-with-resources
- JAVA中的静态代理、动态代理以及CGLIB动态代理分析
- 基于centos7 搭建storm1.2.3集群过程
- JAVA中的浅克隆和深克隆分析
- mysql表占用多少磁盘空间以及清理表空间
- 基于docker快速搭建hbase集群
- 在springboot中对kafka进行读写操作
- [883]python安装包出现Retrying
- 深入理解java虚拟机学习笔记(三)-虚拟机性能监控与故障处理工具
- [884]Elasticsearch可视化工具
- 如何控制nodejs的线程数