这是悦乐书的第349次更新,第374篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Medium级别的第4题(顺位题号是8)。实现将字符串转换为整数的atoi方法。

该函数首先去掉所需丢弃的空白字符,直到找到第一个非空白字符。然后,从该字符开始,采用可选的初始加号或减号,后跟尽可能多的数字,并将它们转换为整数。

字符串可以包含在形成整数之后的其他字符,这些字符将被忽略并且对此函数的行为没有影响。

如果str中的第一个非空白字符不是有效的整数,或者由于str是空的或者只包含空白字符而不存在这样的序列,则不执行转换。

如果无法执行有效转换,则返回零值。

注意

  • 只有空格字符' '被视为空格字符。

假设我们正在处理一个只能在32位有符号整数范围内存储整数的环境:[ -231,231 -1]。如果数值超出可表示值的范围,则返回INT_MAX(231-1)或INT_MIN(-231)。例如:

输入:“42”

输出:42

输入:“ -42”

输出:-42

说明:第一个非空白字符是' - ',这是减号。然后取尽可能多的数字,得到42。

输入:“4193 with words”

输出:4193

说明:转换在数字“3”处停止,因为下一个字符不是数字。

输入:“words and 987”

输出:0

说明:第一个非空白字符是'w',它不是数字或+/-符号。因此,无法执行有效转换。

输入:“-91283472332”

输出:-2147483648

说明:数字“-91283472332”超出32位有符号整数的范围。返回INT_MIN(-2^31)。

02 第一种解法

将字符串转成整数,根据题目给的说明和试错,需要考虑以下几个条件:

  • 是否为空,或者由空格组成。

  • 是否带有正负符号,正号可以忽略,负号在返回结果时需要带上。

  • 以0开头,需要跳过连续的前置0。例如"000123",转换的结果是123。

  • 超过了Integer的最大边界或最小边界。

  • 小数点可以忽略,因为是转成整型,会舍掉小数点后面的数。

  • 出现多个正负符号,直接返回0。例如"+-2",结果是0。

  • 第一位只能是数字(0到9)或者正负符号,出现其他字符直接返回0。

根据上面这些情况,在关键处进行判断即可。

  1. public int myAtoi(String str) {
  2. str = str.trim();
  3. // 判空
  4. if (str.length() < 1) {
  5. return 0;
  6. }
  7. // 判断首位字符
  8. char c = str.charAt(0);
  9. if (!Character.isDigit(c) && c != '-' && c != '+') {
  10. return 0;
  11. }
  12. // 判断符号
  13. boolean flag = false;
  14. if (c == '-') {
  15. flag = true;
  16. }
  17. int end = 0;
  18. for (int i=1; i<str.length(); i++) {
  19. if (Character.isDigit(str.charAt(i))) {
  20. end = i;
  21. } else {
  22. break;
  23. }
  24. }
  25. String newStr = str.substring(flag ? 1 : 0, end+1);
  26. if (newStr.length() < 1 || newStr.equals("+")) {
  27. return 0;
  28. }
  29. // 判断边界
  30. if (!newStr.startsWith("0") && newStr.length() > 12) {
  31. return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
  32. }
  33. Long result = Long.parseLong(newStr);
  34. if (result.toString().length() > 11) {
  35. return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
  36. }
  37. if (result > Integer.MAX_VALUE) {
  38. return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
  39. }
  40. return flag ? 0-(int)result.longValue() : (int)result.longValue();
  41. }

03 第二种解法

在第一种解法的基础上,我们还可以做下优化。

  1. public int myAtoi2(String str) {
  2. if (str == null) {
  3. return 0;
  4. }
  5. str = str.trim();
  6. if (str.isEmpty()) {
  7. return 0;
  8. }
  9. char c = str.charAt(0);
  10. int start = 0;
  11. if (c == '+' || c == '-') {
  12. start = 1;
  13. }
  14. int end = str.length(), n = str.length();
  15. for (int i=start; i<n; i++) {
  16. char ch = str.charAt(i);
  17. if ("0123456789".indexOf(ch) < 0) {
  18. end = i;
  19. break;
  20. } else {
  21. // 截取的字符串长度可能会超过Integer的边界
  22. if (i >= 10) {
  23. long tem = Long.valueOf(str.substring(0, i+1));
  24. if (tem > Integer.MAX_VALUE) {
  25. return Integer.MAX_VALUE;
  26. } else if (tem < Integer.MIN_VALUE) {
  27. return Integer.MIN_VALUE;
  28. }
  29. }
  30. }
  31. }
  32. if (end <= start) {
  33. return 0;
  34. }
  35. long result = Long.valueOf(str.substring(0, end));
  36. if (result > Integer.MAX_VALUE) {
  37. return Integer.MAX_VALUE;
  38. } else if (result < Integer.MIN_VALUE) {
  39. return Integer.MIN_VALUE;
  40. }
  41. return (int)result;
  42. }

04 第三种解法

我们也可以不采用截取字符串的方式,通过计算每一位数,判断是否是0到9的数字,并且判断是否越界。

  1. public int myAtoi3(String str) {
  2. if (str == null) {
  3. return 0;
  4. }
  5. str = str.trim();
  6. if (str.isEmpty()) {
  7. return 0;
  8. }
  9. int index = 0, total = 0, n = str.length();
  10. int sign = 1;
  11. // 判断正负
  12. // 只判断一次,不能使用循环
  13. if (index < n && (str.charAt(index) == '+'
  14. || str.charAt(index) == '-')) {
  15. sign = str.charAt(index) == '-' ? -1 : 1;
  16. index++;
  17. }
  18. // 计算整数
  19. while (index < n) {
  20. int num = str.charAt(index)-'0';
  21. if (num < 0 || num > 9) {
  22. break;
  23. }
  24. // 避免越界
  25. if (total > Integer.MAX_VALUE/10 ||
  26. (total == Integer.MAX_VALUE/10
  27. && num > Integer.MAX_VALUE%10)) {
  28. return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
  29. }
  30. total = total*10 + num;
  31. index++;
  32. }
  33. return total*sign;
  34. }

05 小结

算法专题目前已连续日更超过六个月,算法题文章217+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.8-字符串转整数(String to Integer (atoi))的更多相关文章

  1. 【LeetCode每天一题】String to Integer (atoi)(字符串转换成数字)

    Implement atoi which converts a string to an integer.The function first discards as many whitespace ...

  2. 【Leetcode】【Easy】String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  3. 【leetcode刷题笔记】String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  4. LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))

    8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...

  5. Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串)

    Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串) 题目描述 实现atoi函数,将一个字符串转化为数字 测试样例 Input: "42&q ...

  6. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  7. [leetcode] 8. String to Integer (atoi) (Medium)

    实现字符串转整形数字 遵循几个规则: 1. 函数首先丢弃尽可能多的空格字符,直到找到第一个非空格字符. 2. 此时取初始加号或减号. 3. 后面跟着尽可能多的数字,并将它们解释为一个数值. 4. 字符 ...

  8. 【leetcode】String to Integer (atoi)

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  9. leetcode day6 -- String to Integer (atoi) &amp;&amp; Best Time to Buy and Sell Stock I II III

    1.  String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully con ...

随机推荐

  1. SpringBoot学习笔记(12):计划任务

    SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...

  2. java2 -宏观了解

    java2 -宏观了解 2016-01-24 16:17 308人阅读 评论(38) 收藏 举报  分类: JAVA(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. Java2平台包括: ...

  3. HDU4511 小明系列故事——女友的考验 —— AC自动机 + DP

    题目链接:https://vjudge.net/problem/HDU-4511 小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memor ...

  4. python的tkinter对话框

    import tkinter.messagebox #这个是消息框,对话框的关键 root = tkinter.Tk() root.withdraw() a=tkinter.messagebox.sh ...

  5. Centos6.4 相关配置记录

    1.手动开启eth0网卡 在虚拟机里装完CentOS6.4之后,使用NAT模式,输入ifconfig发现没有IP地址,查找了一下资料,原来是: 在CentOS 6.x的版本中,默认网卡是不开启的,需要 ...

  6. 常见css兼容问题

    链接的虚线框问题 <!-- html --> <a class="noDashedBox" href="#"><img src=& ...

  7. MFC模态对话框程序不响应OnIdle

    从代码分析原因吧: OnIdle函数在MFC的CWinThread::Run函数中被调用,如下 // main running routine until thread exits int CWinT ...

  8. poj 2719 Faulty Odometer

    Description You are given a car odometer which displays the miles traveled as an integer. The odomet ...

  9. ubuntu svn 常用命令

    1.svn svn update 更新 新增文件或文件夹并提交svn add "sss" test.py testw.pysvn add "dir" dir_p ...

  10. 基于zookeeper的MySQL主主负载均衡的简单实现

    1.先上原理图 2.说明 两个mysql采用主主同步的方式进行部署. 在安装mysql的服务器上安装客户端(目前是这么做,以后想在zookeeper扩展集成),客户端实时监控mysql应用的可用性,可 ...