【Java】 剑指offer(67) 把字符串转换成整数

 

本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

  请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。

思路

  题目很简单,主要就是实现对每个字符转化为数字,并进行累加即可。但是有很多特殊情况都需要考虑进去,例如null、空字符串、带有正负号、字符不是数字、溢出等等。

  对于非法的特殊输入,返回值为0,还要用一个全局变量进行标记。

  写代码时一定要考虑清楚各种测试用例。

 

 测试用例

  1.功能测试(正、负、零、带有正负号的数字)

  2.边界值测试(最大正整数,最小负整数)

  3.特殊测试(null,数空字符串,仅有正负号,非法字符)

Java代码

  今天脑子有点乱,代码总感觉不是很简洁,有点繁琐,但功能是完善的。

  附注:字符串如果仅有正负号这里认定为非法输入

//题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不
//能使用atoi或者其他类似的库函数。public class StringToInt {static boolean isValid = false;public static int strToInt(String str) {if(str == null || str.length()<=0)return 0;char[] chars = str.toCharArray();long num=0;  //先用long来存储,以防止越界boolean minus=false;for(int i=0; i<chars.length; i++){if(i==0 && chars[i]=='-'){minus=true;}else if(i==0 && chars[i]=='+'){minus=false;}else{int a=(int) (chars[i]-'0');if(a<0 || a>9){isValid=false;return 0;}num= (minus==false) ? num*10+a : num*10-a;isValid=true;  //不放在最后面是为了防止str=‘+’的情况被判断为trueif((!minus && num>0x7FFFFFFF)||(minus && num<0x80000000)){isValid=false;return 0;}}}return (int)num;}//简单测试下public static void main(String[] args) {System.out.println(strToInt("1948243")==1948243);System.out.println(isValid==true);System.out.println(strToInt("+1948243")==1948243);System.out.println(isValid==true);System.out.println(strToInt("-1948243")==-1948243);System.out.println(isValid==true);System.out.println(strToInt("-0")==0);System.out.println(isValid==true);System.out.println(strToInt("-194+8243")==0);System.out.println(isValid==false);System.out.println(strToInt("")==0);System.out.println(isValid==false);System.out.println(strToInt(null)==0);System.out.println(isValid==false);System.out.println(strToInt("999999999999999")==0);System.out.println(isValid==false);System.out.println(strToInt("+")==0);System.out.println(isValid==false);System.out.println(strToInt("2147483647")==2147483647); //0x7FFFFFFFSystem.out.println(isValid==true);System.out.println(strToInt("2147483648")==0);System.out.println(isValid==false);System.out.println(strToInt("-2147483648")==-2147483648); //0x80000000System.out.println(isValid==true);System.out.println(strToInt("-2147483649")==0);System.out.println(isValid==false);}
}

  

true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
StringToInt

 

收获

  1.熟练掌握char类型转化为int类型操作。

  2.边界值测试,记住int类型最大正整数为0x7FFFFFFF,最小负整数为0x80000000

  3.注意到了负号,也要注意到正号。

 

更多:《剑指Offer》Java实现合集  

 

转载于:https://www.cnblogs.com/yongh/p/9973036.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(89):Charactor包装类统计

//Character方法数量统计 public class test24 {public static void main(String[] args) {char ch A;//使用构造方法Character obj1 new Character(中);//使用静态方法Character obj2 Character.valueOf(ch);char[] arr {5, A, a, C, D, U, 5, 9, ,J,9};countChar(arr);}p…

java学习(90):Character方法大小写转换

//Character方法大小写转换 public class test25 {public static void main(String[] args) {char ch A;//使用构造方法Character obj1 new Character(中);//使用静态方法Character obj2 Character.valueOf(ch);char[] arr {5, A, a, C, D, U, 5, 9, ,J,9};//countChar(arr…

c语言实现socket转json,C++解析JSON进行网络传输--一个通过JSON方式的socket传输

1、客户端&#xff1a;#include "json//json.h"#include #pragma comment(lib, "WS2_32.lib")#pragma comment(lib, "json_vc71_libmtd.lib")int main(){Json::Value val;Json::StyledWriter style_write;val["name"] "xiaoli&q…

《linux就该这么学》第六节,计划任务和用户身份管理!

课本笔记&#xff1a; case条件测试语句 4.4&#xff1a;计划任务服务 at 设置一次性计划任务 at 时间 //设置执行的任务 at -l或atq // 查看设置好但未执行的任务 ctrld 保存at计划任务 ctrlc取消at计划任务 atrm 任务序号…

java学习(91):System类

//System类 import java.util.Date; import java.util.Properties; public class test26 {public static void main(String[] args){testOut(-1);//获取系统时间long sysTimeSystem.currentTimeMillis();System.out.println(sysTime);Date datenew Date();System.out.println(d…

c语言 用一维数组存储二叉树,用一维数组存储二叉树时,总是以前序遍历顺序存储结点。( ? )...

用前模式包括献不治疗的积人本哪项以下极贡。维数包括学校工作的过程和方面以下技术几个社区。组存总题大括&#xff1a;致包青少区问年社。可能在含工气体含有有或井施&#xff0c;备合格的个人和相防护应配用具应(。部件理液更换切断或修液压压钳应先。特殊须提劳动理情况前解…

Servlet 文件上传

Servlet 可以与 HTML form 标签一起使用&#xff0c;来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。 本文使用到的文件有&#xff1a; 创建一个文件上传表单 下面的 HTML 代码创建了一个文件上传表单。以下几点需要注意&#xff1a; 表单 method…

java学习(92):线程的创建方法一

//线程的创建方法1class Xc extends Thread {public void run(){for (int i0;i<20;i){System.out.println("我是歌谣");}} } public class test27{public static void main(String[] args){Xc xcnew Xc();xc.start();//程序会自动调用run方法for (int i0;i<20;…

java学习(93):线程的创建方法二

//创建线程的第二种方法class Xc2 implements Runnable {public void run(){for (int i0;i<20;i){System.out.println("我是歌谣");}} } public class test28{public static void main(String[] args){Xc2 xc2new Xc2();Thread anew Thread(xc2);a.start();//xc.s…

Pycharm使用之设置代码字体大小和颜色主题

1. File->Setting 打开如下所示的对话框&#xff0c;可以在Editor->General->Font下设置字体大小&#xff08;Size&#xff09;、行距&#xff08;Line spacing&#xff09; 2. Editor->Color Scheme 展开如下所示内容&#xff0c;可以选择自己喜欢的主题样式&am…

c语言分量的运算符,C语言基础(04-运算符和表达式)

运算符(也叫操作符)&#xff0d;&#xff0d;运算符是一个表示特定的数学或逻辑操作的符号。如号&#xff0c;表示了一个相加运算&#xff1b;&&号表示了一个逻辑‘与’的运算。由运算符把需要进行运算的各个量(常量或变量)连接起来组成一个表达式。下面要讲的是标准的…

java学习(94):cpu随机调用线程测试

//创建线程 class Xc3 extends Thread {public void run(){System.out.println("当前线程的名称为"Thread.currentThread().getName());} } public class test29{public static void main(String[] args){Xc3 xc3new Xc3();xc3.setName("线程1");//程序会自…

Linux学习——echo和read命令用法

转载自http://www.runoob.com/linux/linux-comm-read.html http://www.178linux.com/76331 echo命令 本文列举了echo命令的几个常用用法并加以实例说明&#xff0c;以作回顾、参考。 echo命令常用作打印输出字符串&#xff0c;根据echo帮助文件可以获得以下信息&#xff1a; 语…

w ndows 高级索引,软媒原创:为Windows7建立索引,搜索文件更给力

Win7之家(www.win7china.com)&#xff1a;软媒原创&#xff1a;为Windows7建立索引&#xff0c;搜索文件更给力也许你还记得XP时代搜索文件时出现的那只黄色的小狗狗&#xff0c;在Windows7时代&#xff0c;搜索变得更加快捷顺手&#xff0c;搜索栏就在那里&#xff0c;不点不搜…

java学习(95):线程的优先级

public class test30 {public static void main(String[] args){Thread xc11new Thread(new Xc41());Thread xc12new Thread(new Xc42());xc11.setPriority(Thread.NORM_PRIORITY3);//数字越大&#xff0c;优先级越高&#xff0c;默认为5xc11.start();xc12.start();} } class X…

java学习(96):线程的睡眠

//线程的睡眠 public class test31 {public static void main(String[] args){Xc43 xc43new Xc43();Thread cccnew Thread(xc43);ccc.start();} } class Xc43 implements Runnable {public void run(){for (int i0;i<10;i){System.out.println(Thread.currentThread().getNa…

java学习(97):中断线程的另一种处理

public class test32 {public static void main(String[] args){Thread xc13new Thread(new Xc44());Thread xc14new Thread(new Xc44());xc13.setName("线程一");xc14.setName("线程二");xc13.start();xc14.start();} } class Xc44 implements Runnable {…

调试nodejs项目接口,使用Posman,用req.body拿不到数据

近日在postman 上面测试nodejs写的post接口&#xff0c;发现后台接受不到数据。 很多人其实不知道怎么postman 上面GET和POST怎么使用的 Postman接口操作 1.GET请求操作&#xff1a; 2.GET请求操作结果&#xff1a; 3.POST请求操作&#xff1a; 4.POST请求操作结果&#xff1a;…

x-lite for linux,Linux Lite 4.6正式发布:现基于Ubuntu 18.04.3 LTS

原标题&#xff1a;Linux Lite 4.6正式发布&#xff1a;现基于Ubuntu 18.04.3 LTS创建者Jerry Bezencon于今天正式宣布Linux Lite 4.6系统版本更新&#xff0c;和上个版本4.4相隔5个月时间。新版本基于Canonical最近发布的Ubuntu 18.04.3 LTS(Bionic Beaver)操作系统&#xff0…

java学习(98):线程join使用中断进行另一个

public class test33 {public static void main(String[] args) {Xc46 xc46new Xc46();Thread dd new Thread(xc46);dd.start();try {dd.join();} catch (Exception e) {}for (int i0;i<15;i) {System.out.println("主函数"i);}} } class Xc46 implements Runna…