博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(52):字符串转为数字
阅读量:4287 次
发布时间:2019-05-27

本文共 1548 字,大约阅读时间需要 5 分钟。

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

分析

该题最重要的就是各种边界条件的判定,保持代码的健壮性。需要考虑的条件包括:

  1. 输入的字符串为空串或者为空指针,返回0。
  2. 输入的字符串包含除“+”、“-”、0~9数字之外的其他非法字符,返回0。
  3. 输入的字符串包含多个“+”、“-”,返回0。
  4. 输入的字符串长度为1,并且仅仅包含“+”或者“-”,返回0。
  5. 转化的数字超过int的下限或者上限,发生溢出,返回0。

此处只要参考了JDK源码中的部分,Integer.parstInt(String str)函数,关于该函数源码的具体大数溢出问题的说明,可以参见文章中“大数溢出问题”的部分。

牛客AC:

public class Solution {
public int StrToInt(String str) { if (str == null || str.length() <= 0) return 0; int result = 0; int limit = -Integer.MAX_VALUE; // 对上限取反不会发生溢出 boolean isNegetive = false; int length = str.length(); int index = 0; char firstChar = str.charAt(0); if (firstChar < '0') { if (firstChar == '-') { isNegetive = true; limit = Integer.MIN_VALUE; } else if (firstChar != '+') return 0; if (length == 1) return 0; index++; } while (index < length) { char c = str.charAt(index); int digit = c - '0'; if (digit < 0 || digit > 9) return 0; // 除以10必须放在不等式右侧防止左侧溢出 // 如果满足条件,说明 result*10不会发生溢出 if (result < limit / 10) return 0; result *= 10; // digit必须放在不等式右侧防止左侧溢出,判断防止最终溢出 // 如果满足条件说明 result-digit不会发生溢出 if (result < limit + digit) return 0; // 当成负数累减 result -= digit; index++; } return isNegetive ? result : -result; }}

转载地址:http://ykxgi.baihongyu.com/

你可能感兴趣的文章
linux系统一个tomcat配置两个域名,每个域名对应一个项目
查看>>
javaScript使用Lodop实现网页表格套打功能
查看>>
技术大牛如何寻找下一个风口
查看>>
大数据学习路线大纲
查看>>
html入门之meta
查看>>
mvn不是内部或外部命令,也不是可运行的程序或批处理文件
查看>>
JAVA:JDBC连接MySQL数据库
查看>>
struts2流程简述
查看>>
struts2文件上传和下载
查看>>
值栈与OGNL
查看>>
struts2标签库--分类入门
查看>>
Struts2声明式异常处理
查看>>
Web.xml中jsp-config元素简述
查看>>
Struts2类型转换和自定义类型
查看>>
Java面向对象特征有那些
查看>>
hibernate单表继承映射
查看>>
继承结构中每个子类单独一张表
查看>>
HQL查询-分页-条件-连接-过滤使用
查看>>
hibernate加载策略之lazy
查看>>
hibernate抓取策略fetch
查看>>