自己实现字符串转整数(不使用JDK的字符串转整数的方法)
【需求】:
(1)如果输入的字符串为null,为空,或者不是数字,抛出异常;
(2)如果输入的数字超出int的最大值或最小值,抛出异常;
(3)输入的数字允许以+或-号开头,但如果输入的字符串只有"+"或"-"号,则抛出异常;
【实现思路】:
关键:字符串 -> 字符 -> 整数。
输入的字符串中的每一个字符都应该是从'0'到'9'这10个字符中的某一个,而这10个字符的ASCII码是有序的,所以后一个字符的ACSII码减去前一个字符的ASCII码一定等于1,根据这个特性,让两个字符做减法运算就能得到一个int类型的值,进而推导出让一个数字字符对'0'做减法,就能到该字符对应的那个整数,比如'5'减去'0'等于5。
又由于一个整数有低位和高位的概念,比如个位、十位、百位、千位等,而任意整数都会满足如下规律:
个位就是个位上的数字乘以10的0次幂,十位就是十位上的数字乘以10的1次幂,百位就是百位上的数字乘以10的2次幂,千位就是千位上的数字乘以10的3次幂,以此类推
最后将上面运算的结果累加起来,就是最终的整数,比如 3256=3*1000+2*100+5*10+6。
【代码实现】
/**
* 自己实现字符串转整数
* 基本思路: 字符串 -> 字符 -> 整数
* 整数拆分规律: 3256 = 3*10^3 + 2*10^2 + 5*10^1 + 6*10^0
* @param s
* @return
*/
public static int parseInt(String s) {
//保留原始参数
String str = s;
if (str == null || str == "") throw new NumberFormatException("For input string:\"" + s + "\"");
//是否为负数
boolean negative = false;
// 是否以+号或-号开头
if(str.startsWith("+") || str.startsWith("-")) {
if (str.startsWith("-")) negative = true;
str = str.substring(1);
// 以+或-开头,但是后面没有数字
if (str == "" || str.length() == 0) throw new NumberFormatException("For input string:\"" + s + "\"");
}
char[] chars = str.toCharArray();
long result = 0;
for (int i = 0; i < chars.length; i++) {
// 是否是'0'到'9'之间的字符
if (chars[i] < '0' || chars[i] > '9') throw new NumberFormatException("For input string:\"" + s + "\"");
// 先根据字符之间进行运算来得到int值,再根据每个数字所在的位数来计算应该乘10的几次幂(Math.pow()函数用于求幂),最后累加。
result += (chars[i] - '0') * Math.pow(10, chars.length - i - 1);
// 是否超出int的最小值
if (negative && -result < Integer.MIN_VALUE) {
throw new NumberFormatException("For input string:\"" + s + "\"");
}
// 是否超出int的最大值
if (!negative && result > Integer.MAX_VALUE) {
throw new NumberFormatException("For input string:\"" + s + "\"");
}
}
if (negative) result = -result;
return (int) result;
}
我怎么感觉我的代码实现要比JDK官方的更简洁更易懂呢^_^
自己实现字符串转整数(不使用JDK的字符串转整数的方法)的更多相关文章
- shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢?
shell中的变量a=100, 什么时候作整数使用, 什么时候作字符串使用呢? 这确实是一个困扰很久的一个问题? how it can be an issue? 事实上, 在shell中, 你可以认为 ...
- redis 笔记01 简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表
文中内容摘自<redis设计与实现> 简单动态字符串 1. Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS(Simple Dynamic String,简单动态 ...
- 写一个函数,输入int型,返回整数逆序后的字符串
刚刚看到一个面试题:写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个參数.必须返回字符串.&quo ...
- C#如何测量字符串的高度宽度和精确取得字符串的高度宽度
C#如何测量字符串的高度宽度和精确取得字符串的高度宽度 因为MFC中CDC有GetTextExtent()可以获得字符串的高度宽度 像素单位,所以自然想到c#的GDI+的MeasureString,这 ...
- C语言风格字符串的概念、定义、输入字符串、输出字符串
字符串: C语言中最有用.最重要的数据类型之一. 字符串:是以\0字符结尾的char类型数组.所以可以把数组和指针知识应用于字符串. 如何在程序定义字符串: 1.字符串字面量 用双引号括起来的内容称为 ...
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
C#字符串数组排序 //排序只带字符的数组,不带数字的 private string[] aa ={ "a ", "c ", "b & ...
- 《挑战30天C++入门极限》C/C++中字符串常量的不相等性及字符串的Copy
C/C++中字符串常量的不相等性及字符串的Copy #include <iostream> void main(void) { if("test&quo ...
- python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数。如果不存在这样一对整数,则输入一条消息进行说明。
python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数.如果不存在这样一对整数,则输入一条消息 ...
- 错误:Unsupported major.minor version 51.0(jdk版本错误)的解决方法
错误:Unsupported major.minor version 51.0(jdk版本错误)的解决方法 java.lang.UnsupportedClassVersionError: org/ap ...
随机推荐
- 如何使用 Git LFS 提交大文件?
参考资料: An open source Git extension for versioning large files Git LFS的使用 如何使用 Git LFS 提交大文件? Git LFS ...
- Springboot 2.0.x 引入链路跟踪Sleuth及Zipkin
Zipkin是一种分布式跟踪系统,它有助于收集解决微服务架构中得延迟问题所需的时序数据,它管理这些数据的收集和查找. 1. 架构概述 跟踪器存在于您的应用程序中,并记录有关发生的操作的时间和元数据.他 ...
- 两类传输协议:TCP,UDP
1) TCP是Transfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket ...
- asp.net core 托管与部署
一.使用IIS在Windows上进行托管 1,部署asp.net core ①检查安装最新的SDK和运行时 https://www.microsoft.com/net/download/windows ...
- Html5 postMessage实现跨域消息传递
一.同源策略 要理解跨域,我们首先要知道什么是同源策略.百度百科上这样定义同源策略:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略, ...
- BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)
题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...
- BZOJ.3920.Yuuna的礼物(莫队 分块套分块 分段离散化)
题目链接 详细题解:https://www.cnblogs.com/autsky-jadek/p/4376091.html 代码参考自:https://www.cnblogs.com/Sakits/p ...
- 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)
1,new方法: 类每次实例化时都会创建一个新的对象, class Textcls: # cls 是指类本身, def __new__(cls, *args, **kwargs): # 在 __ini ...
- 2018 OO第一次总结(作业1-3)
第一次作业1.程序分析 (1)OO度量 (2)类图: (3)分析与评价: 这次作业由于作业整体设计难度不大,因此按照去年暑假上的OO先导课老师讲的设计方法很容易实现一个还不错的面向对象式程序,类与类之 ...
- [Java web]Spring+Struts2+Hibernate整合过程
摘要 最近一直在折腾java web相关内容,这里就把最近学习的spring+struts2+hibernate进行一个整合,也就是大家经常说的ssh. 环境 工具IDE :Idea 2018 数据库 ...