自己实现字符串转整数(不使用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 ...
随机推荐
- Faster RCNN 学习与实现
论文 论文翻译 Faster R-CNN 主要分为两个部分: RPN(Region Proposal Network)生成高质量的 region proposal: Fast R-CNN 利用 reg ...
- mysql5.7一键安装脚本
0. 概述 最近鼓捣出了一个mysql安装脚本,将该脚本,mysql的my.cnf文件,mysql的安装包这三个文件放在同一个目录下面,执行sh mysql-auto-install.sh就可以完成m ...
- DB安装
start from the execute file : DB2_ESE_10_Win_x86-64\setup.exe Navigator to "Install a Product&q ...
- mysql 用户/密码/权限操作
由于最近使用mysql遇到了修改用户密码的问题,所以一块学习了一下关于用户的相关操作: 1. 创建新账户 CREATE USER 'jeffrey'@'localhost'; 2. 账户设置密码 #当 ...
- cf348D. Turtles(LGV定理 dp)
题意 题目链接 在\(n \times m\)有坏点的矩形中找出两条从起点到终点的不相交路径的方案数 Sol Lindström–Gessel–Viennot lemma的裸题? 这个定理是说点集\( ...
- 解析3D标签云,其实很简单
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 最近开始用canvas搞3D了,搞得也是简单的东西,就是球体转圈.做出来后,突然想起以前看过的3D标签云,在以前觉得真心狂拽酷炫叼啊,当时 ...
- BZOJ4053 : [Cerc2013]Subway
通过BFS可以求出到每个站点的最小花费. 每次从队首取出一个点,枚举所有它能花费1块钱就到达的线路,通过两遍递推求出最大时间. 注意到每个点和每条线路只有第一次使用时有用,所以总时间复杂度为$O(n+ ...
- Saltstack 安装 命令
主机规划 10.0.0.21 master 10.0.0.22 minion 10.0.0.23 minion 基础环境 [root@10.0.0.21 ~]# cat /etc/redhat-rel ...
- C#6.0特性与vs2015
C#6.0 中的那些新特性 1. 自动属性的初始化 public string Name { get; set; } = "zhangsan"; 2. 只读属性初始化 public ...
- nginx限制ip访问(转)
一.服务器全局限IP #vi nginx.conf allow 10.57.22.172; #允许的IP deny all; 二.站点限IP #vi vhosts.conf 站点全局限IP ...