题目描述

实现函数 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;}
}

常考数据结构与算法:将字符串转为整数相关推荐

  1. 常考数据结构与算法:反转字符串

    题目描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000) 示例 输入 "abcd" 返回值 "dcba" publi ...

  2. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  3. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  4. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  5. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  6. 常考数据结构与算法-manacher算法

    回文字符串123321 回文直径:6 回文半径:3 求一个字符串中的最长回文字符串. abc123321def 一般会在原字符串中添加特殊字符,比如添加"#". 变成#a#b#c# ...

  7. 常考数据结构与算法:表达式求值

    题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 示例2 输入 "(2*(3-4))*5" 返回值 -10 运算符号有优先级,所以使用单调栈可以解决改问题.如下代码,效率比 ...

  8. 常考数据结构与算法:最长回文子串

    暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串. /** 暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串.*/public int getLongestPalindro ...

  9. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

最新文章

  1. mysql命令行显示乱码_mysql命令行显示乱码的解决方法
  2. 我对javascript对象的理解
  3. 基于uPC2710T设计信标射频放大电路
  4. 原来,苹果一直在给自家应用开防火墙绿灯!
  5. 设计模式一:设计模式遵循的原则
  6. 根据数据库表字段删除所有相关信息(删库)
  7. 用maven运行指定java类main方法
  8. itools 不支持缩略图下载_PS插件缩略图3.8.0.96安装教程
  9. Android ProgressBar手动控制开始和停止
  10. SUSE12SP3-Mycat(2)Schema.xml配置详解
  11. 使用shadow dom封装web组件
  12. 6.MongoDB之索引
  13. 基于PHP的校园bbs论坛系统
  14. Duilib--->Duilib库介绍总结概述
  15. 微信小程序开发百度云分享
  16. 一篇文章搞定嵌入式看门狗watch dog概述与示例代码
  17. ubuntu下bochs的安装和配置
  18. Google免费企业邮局设置攻略
  19. SWUSTOJ #78 计算生日是星期几
  20. 微信公众号 - 网页服务 - 分享接口

热门文章

  1. JEECG弹出框提交表单
  2. requestAnimationFrame
  3. java的单例设计模式
  4. img标签使用默认图片的一种方式
  5. NodeJS学习笔记(四) events,util模块
  6. Loadrunner 8.1 下载
  7. LeetCode算法题11:递归和回溯-解数独
  8. Magento2插件
  9. Centos:mysql的安装和使用:yum方式
  10. 豪华电动汽车品牌“歌昂” 即将登场,背后是国内新造车势力新特