常考数据结构与算法:将字符串转为整数
题目描述
实现函数 atoi 。函数的功能为将字符串转化为整数
提示:仔细思考所有可能的输入情况。这个问题没有给出输入的限制,你需要自己考虑所有可能的情况。
思路: 1. 需要判断正负数 2. 需要考虑字符串中包含其他非数字字符 3. 需要考虑越界。
在不断增加位数时判断整形是否越界的方法:
一个整形变量存储到超过其自身的数的时候,不会报错,但是数字本身会被压缩,导致无法检查是不是越界了。
那么,如何在ans不断迭代增加自身的过程中,知道是否会越界呢?
第一种方法,用一个long long 来迭代,然后若超过INT_MAX就返回零。这显然不是不可以,但无缘无故占据很多空间。
第二种方法,在还未越界的前一次循环检查。总共两种情况:
ans>INT_MAX/10,此时还有一个数位未加,但是无论加什么都会越界,所以直接返回0;
ans==INT_MAX/10, 此时检查最后一个数位,如果大于7,则返回零
对于INT_MIN也是一样。
注意要先判断,再加上最后一位。
package datastructure;public class AtoiMe {public static void main(String[] args) {/** 1. 最大整数,最小负数溢出问题* 2. 输入中有非数字字符* 3. 正负号*/AtoiMe atoiMe = new AtoiMe();/*测试用例:"""1""+1""-1""123""-123""010"" 010"" +004500"" -00134"" -117e40091539"" -1198043894c5"" 110d48698376"" -1209792x4157"" 11333713950"" -10441643317j"" 113588084s51""11x294569828"" 108116921w12"" +10c571429600"输出结果:011-1123-12310104500-134-117-1198043894110-12097922147483647-21474836481135880841110811692110*/String str = "+2147483647";String str2 = "-9";String str3 = "10441643317j";String str4 = "-00134";int i = atoiMe.StrToInt(str3);System.out.println(i);i = 0x7fffffff;System.out.println(i);i = Integer.MAX_VALUE+ 1;
//
// i = 0xffffffff;
// System.out.println(i);
//
// i = Integer.parseInt("132s");
// System.out.println(i);}public int StrToInt(String str) {if (null == str || "".equals(str) || "".equals(str.trim())) {return 0;}str = str.trim();int flag = 1;int ans = 0;int index = 10;char[] chars = str.toCharArray();for (int i = 0; i < chars.length; i++) {if (i == 0 && '-' == (chars[i])) {// 判断正负号flag = -1;} else if (i == 0 && '+' == chars[i]) {// 判断正负号flag = 1;} else if (chars[i] >= 48 && chars[i] <= 57) {//判断数据是否溢出if(ans>0x7fffffff/10 || (ans == 0x7fffffff/10 && (chars[i] - 48) > 7)){//判断数据是否溢出if (flag == 1 ){return ans = 0x7fffffff;}else if(flag == -1){return ans = 0x80000000;}}ans = ans * index + (chars[i] - 48);}else {break;}}return ans * flag;}
}
常考数据结构与算法:将字符串转为整数相关推荐
- 常考数据结构与算法:反转字符串
题目描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000) 示例 输入 "abcd" 返回值 "dcba" publi ...
- 常考数据结构与算法:找到字符串的最长无重复字符子串
题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...
- 常考数据结构与算法:输出二叉树的右视图
题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...
- 常考数据结构与算法:求二叉树的层序遍历
题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...
- 常考数据结构与算法:最长公共子串
题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...
- 常考数据结构与算法-manacher算法
回文字符串123321 回文直径:6 回文半径:3 求一个字符串中的最长回文字符串. abc123321def 一般会在原字符串中添加特殊字符,比如添加"#". 变成#a#b#c# ...
- 常考数据结构与算法:表达式求值
题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 示例2 输入 "(2*(3-4))*5" 返回值 -10 运算符号有优先级,所以使用单调栈可以解决改问题.如下代码,效率比 ...
- 常考数据结构与算法:最长回文子串
暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串. /** 暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串.*/public int getLongestPalindro ...
- 常考数据结构与算法:删除链表的倒数第n个节点
题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...
最新文章
- mysql命令行显示乱码_mysql命令行显示乱码的解决方法
- 我对javascript对象的理解
- 基于uPC2710T设计信标射频放大电路
- 原来,苹果一直在给自家应用开防火墙绿灯!
- 设计模式一:设计模式遵循的原则
- 根据数据库表字段删除所有相关信息(删库)
- 用maven运行指定java类main方法
- itools 不支持缩略图下载_PS插件缩略图3.8.0.96安装教程
- Android ProgressBar手动控制开始和停止
- SUSE12SP3-Mycat(2)Schema.xml配置详解
- 使用shadow dom封装web组件
- 6.MongoDB之索引
- 基于PHP的校园bbs论坛系统
- Duilib--->Duilib库介绍总结概述
- 微信小程序开发百度云分享
- 一篇文章搞定嵌入式看门狗watch dog概述与示例代码
- ubuntu下bochs的安装和配置
- Google免费企业邮局设置攻略
- SWUSTOJ #78 计算生日是星期几
- 微信公众号 - 网页服务 - 分享接口