题目描述:

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

解题思路:

这道题简直让人抓狂!试了许多次都没有通过,原因是要考虑多种情况。主要考虑的因数有:

  1. 要考虑前几个或全部字符都是空白字符的情况;
  2. 要考虑第一个字符是+,-,还是0-9的字母,或是其他字符;
  3. 要考虑有没有值得溢出,尤其是最小值溢出;
  4. 若中间有非数字字符,要返回之前的数字,如“123a34”要返回123;
  5. 若以若干个0开始,则0要忽略,如“-0000234”要返回-234

找出这几种情况之后,就代码就不难写了。总之这道题AC率很低的原因并不是逻辑有多难,而是很难考虑到全部的情况。

具体代码:

  1. public class Solution {
  2. public static int myAtoi(String str) {
  3. //取出两边空白字符
  4. str=str.trim();
  5. if(str==null||str.length()==0)
  6. return 0;
  7. if(str.length()==1){
  8. if(str.charAt(0)>='0' && str.charAt(0)<='9')
  9. return Integer.valueOf(str);
  10. else
  11. return 0;
  12. }
  13. //第一个字符是'+
  14. if(str.charAt(0)=='+'){
  15. String s = str.substring(1);
  16. if(isValid(s)){
  17. s=fun(s);
  18. if(s==null)
  19. return 0;
  20. MyCompatator m = new MyCompatator();
  21. if(m.compare(s, ""+Integer.MAX_VALUE)>=0){
  22. return Integer.MAX_VALUE;
  23. }
  24. else{
  25. return Integer.valueOf(s);
  26. }
  27. }
  28. else{
  29. s=fun1(s);
  30. if(s==null)
  31. return 0;
  32. s=fun(s);
  33. if(s==null)
  34. return 0;
  35. MyCompatator m = new MyCompatator();
  36. if(m.compare(s, ""+Integer.MAX_VALUE)>=0){
  37. return Integer.MAX_VALUE;
  38. }
  39. else{
  40. return Integer.valueOf(s);
  41. }
  42. }
  43. }
  44. //第一个字符是'-
  45. else if(str.charAt(0)=='-'){
  46. String s = str.substring(1);
  47. if(isValid(s)){
  48. s=fun(s);
  49. if(s==null)
  50. return 0;
  51. MyCompatator m = new MyCompatator();
  52. StringBuilder sb =new StringBuilder(""+Integer.MIN_VALUE);
  53. sb.deleteCharAt(0);
  54. String ss=sb.toString();
  55. if(m.compare(s, ss)>=0)
  56. return Integer.MIN_VALUE;
  57. else{
  58. return Integer.valueOf(str);
  59. }
  60. }
  61. else{
  62. s=fun1(s);
  63. if(s==null)
  64. return 0;
  65. s=fun(s);
  66. if(s==null)
  67. return 0;
  68. MyCompatator m = new MyCompatator();
  69. StringBuilder sb =new StringBuilder(""+Integer.MIN_VALUE);
  70. sb.deleteCharAt(0);
  71. String ss=sb.toString();
  72. if(m.compare(s, ss)>=0)
  73. return Integer.MIN_VALUE;
  74. else{
  75. return Integer.valueOf("-"+s);
  76. }
  77. }
  78. }
  79. //第一个字符是数字
  80. else if(str.charAt(0)>='0' && str.charAt(0)<='9'){
  81. if(isValid(str)){
  82. str=fun(str);
  83. if(str==null)
  84. return 0;
  85. MyCompatator m = new MyCompatator();
  86. if(m.compare(str, ""+Integer.MAX_VALUE)>=0){
  87. return Integer.MAX_VALUE;
  88. }
  89. else{
  90. return Integer.valueOf(str);
  91. }
  92. }
  93. else{
  94. str=fun1(str);
  95. if(str==null)
  96. return 0;
  97. str=fun(str);
  98. if(str==null)
  99. return 0;
  100. MyCompatator m = new MyCompatator();
  101. if(m.compare(str, ""+Integer.MAX_VALUE)>=0){
  102. return Integer.MAX_VALUE;
  103. }
  104. else{
  105. return Integer.valueOf(str);
  106. }
  107. }
  108. }
  109. //第一个字符是其他数字则出错
  110. else{
  111. return 0;
  112. }
  113.  
  114. }
  115. //判断字符串是否是由数字组成的
  116. public static boolean isValid(String s){
  117. //return s.matches("[1-9][0-9]*");
  118. return s.matches("[0-9]+");
  119. }
  120. //将数字串开始的0全部去掉
  121. public static String fun(String s){
  122. int index=0;
  123. boolean key=false;
  124. for(index=0;index<s.length();index++){
  125. if(s.charAt(index)!='0'){
  126. key=true;
  127. break;
  128. }
  129. }
  130. if(key){
  131. return s.substring(index);
  132. }
  133. else{
  134. return null;
  135. }
  136. }
  137. //截取第一个不是数字字符之前的数字
  138. public static String fun1(String s){
  139. int index=0;
  140. for(index=0;s.charAt(index)>='0'&&s.charAt(index)<='9';index++){
  141.  
  142. }
  143. if(index==0)
  144. return null;
  145. return s.substring(0,index);
  146. }
  147. }
  148. class MyCompatator implements Comparator<String>{
  149.  
  150. @Override
  151. public int compare(String s1, String s2) {
  152. if(s1.length()>s2.length()){
  153. return 1;
  154. }
  155. else if(s1.length()<s2.length()){
  156. return -1;
  157. }
  158. else{
  159.  
  160. for(int i=0;i<s1.length();i++){
  161. if(s1.charAt(i) - s2.charAt(i) >0)
  162. return 1;
  163. else if(s1.charAt(i) - s2.charAt(i) <0)
  164. return -1;
  165. else
  166. ;
  167. }
  168. return 0;
  169. }
  170. }
  171.  
  172. }

【leetcode】8. String to Integer (atoi)的更多相关文章

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

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,P ...

  2. 【LeetCode】8. String to Integer (atoi) 字符串转整数

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

  3. 【LeetCode】008. String to Integer (atoi)

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

  4. 【一天一道LeetCode】#8. String to Integer (atoi)

    一天一道LeetCode系列 (一)题目 Implement atoi to convert a string to an integer. Hint: Carefully consider all ...

  5. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  6. 《LeetBook》leetcode题解(8): String to Integer (atoi) [E]——正负号处理

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  7. 【LeetCode】7 & 8 - Reverse Integer & String to Integer (atoi)

    7 - Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Notic ...

  8. 【leetcode❤python】 8. String to Integer (atoi)

    #-*- coding: UTF-8 -*-#需要考虑多种情况#以下几种是可以返回的数值#1.以0开头的字符串,如01201215#2.以正负号开头的字符串,如'+121215':'-1215489' ...

  9. 【LeetCode】7、Reverse Integer(整数反转)

    题目等级:Easy 题目描述: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 O ...

随机推荐

  1. Codeforces Round #327 (Div. 2) A. Wizards' Duel 水题

    A. Wizards' Duel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/prob ...

  2. 04.URL路径访问与模块控制器之间的关系

    <?php //初使化,进行加载. //通过这个英文名来了解,他是定义的与thinkphp有关的核心框架文件目录路径 //他可以通过这一个常量,在以后运行的时候都去找这个路径,确保在运行过程当, ...

  3. ERROR 1227 (42000): Access denied; you need (at least one of) the PROCESS privilege(s) for this oper

    1  用以往的mysql登陆模式登陆 [mysql@eanintmydbc002db1 mysqllog]$ mysql Enter password:  Welcome to the MySQL m ...

  4. Android实现图表绘制和展示

    本文演示在Android平台中绘制和展示图表示例,本示例是基于RChart 2实现的. 在一个系统中经常要用到图表统计数据,在WEB开发中图表绘制是一件简单的事情,因为有比较多的开源方案.但在Andr ...

  5. unity工程接入Android sdk后真机测试解锁屏后退出的解决

    unity工程接入如91.移动支付等Android sdk后,真机运行尤其是在4.0+以上坏境,往往会出现解锁屏后退出的情况,解决办法如下: 可以在AndroidManifest.xml中所有的con ...

  6. Jquery Validate根据其他元素的事件来触发单个元素的异步校验

    场景:在做一个车辆信息管理模块,而车牌是通过车牌颜色和车牌号码来确定唯一性的,录入车牌信息时需对车牌进行唯一性校验.

  7. 关于使用NotificationComat导致android2.3及以下版本无法显示自定义布局的解决方法.

    大伙都知道 android-support-v4为我们提供了很多兼容的解决方案, 其中就有关于通知栏的. NotificationCompat, 顺利成章操刀显示通知. eg: Intent inte ...

  8. Linux内核--网络栈实现分析(一)--网络栈初始化--转

    转载地址 http://blog.csdn.net/yming0221/article/details/7488828 作者:闫明 本文分析基于内核Linux Kernel 1.2.13 以后的系列博 ...

  9. 12096 - The SetStack Computer UVA

    Background from Wikipedia: \Set theory is a branch of mathematics created principally by the German ...

  10. Java基础知识强化之集合框架笔记75:哈希表

    1. 哈希表数据结构(数组): 2. 哈希表确定元素是否相同: (1)判断的是两个元素的哈希值是否相同                     如果相同,再判断两个对象内容是否相同 (2)判断哈希值相 ...