LeetCode08:String to Integer(atoi)

原题目:
Implement atoi to convert a string to an integer.
实现atoi函数,即将字符串转化为整数

算法分析:
函数首先丢弃所需的空格字符,直到找到第一个非空格字符。然后,从该字符开始,采用可选的初始加号或减号,后跟尽可能多的数字,并将其解释为数值。
字符串可以包含在形成整数数字之后的附加字符,这些字符被忽略,并且对此函数的行为没有影响。
如果str中的非空格字符的第一个序列不是有效的整数,或者如果没有这样的序列,因为str是空的或者它只包含空格字符,则不执行转换。
如果不能执行有效的转换,则返回零值。如果正确的值超出可表示值的范围,则返回INT_MAX(2147483647)或INT_MIN(-2147483648)。

遇到问题及解决方法:

1.如果字符串前几位为空字符,则应该先判断并丢弃
2.判断字符串中的+-号,并输出相应的正负值
3.如果字符串中间出现空格或其他字符,则不执行转换,直接退出
4.注意判断数值越界,输出应为整数的最大值和最小值之间


错误代码:
错误1:Wrong answer 没有判断在字符串中间出现非法字符的情况
public int myAtoi(String str){
        if(str == null || str.length() < 1){
            return 0;
        }
        //int i = 1;
        String tmp = str.replaceAll(" """);
        char first = tmp.charAt(0);
        /*while(first == ' '){
            first = str.charAt(i);
            i++;
            System.out.println("i=" + i + "first=" + first);
        }*/
        
        if(first == '-'){
            return parseString(tmp,1,false);
        }else if(first == '+'){
            return parseString(tmp,1,true);
        }else if(first <='9' && first >= '0'){
            return parseString(tmp,0,true);
        }else {
            return 0;
        }
    }
    
    public boolean isDigit(char c){
        return c >= '0'&&c <= '9';
    }
    
    public int parseString(String str,int index,boolean positive){
        if(index >= str.length()){
            return 0;
        }
        
        int result;
        long tmp = 0;
        while(index < str.length()&&isDigit(str.charAt(index))){
            tmp = tmp*10 + str.charAt(index) - '0';
            if(tmp > 0x8000_0000L){
                return Integer.MAX_VALUE;
            }
            index++;
        }
        
        if(positive){
            if(tmp >= 0x8000_0000L){
                return Integer.MAX_VALUE;
            }else if(tmp == 2147483648L){
                result = (int)(tmp - 1);
            }else{
                result = (int)tmp;
            }
        }
        else{
            if(tmp == 0x8000_0000L){
                return result = 0x8000_0000;
            }
            else{
                result = (int)-tmp;
            }
        }
        return result;
    }  

 错误2:整数越界

 

LeetCode提交源码:
   
   
  1. public int myAtoi(String str){
  2. int num = 0;
  3. int sign = 1;
  4. final int n = str.length();
  5. if(n == 0)
  6. return 0;
  7. int i = 0; //i指向字符串的每一个字符
  8. while(i < n && str.charAt(i) == ' ') //判断是否为空字符串,去除空字符串
  9. i++;
  10. if(str.charAt(i) == '+'){
  11. i++;
  12. }
  13. else if(str.charAt(i) == '-'){
  14. sign = -1; //判断正负数的符号位
  15. i++;
  16. }
  17. for(; i < n; i++){
  18. if(str.charAt(i) < '0' || str.charAt(i) > '9') //只要在字符串中间出现非数字,则直接中断退出循环
  19. break;
  20. if(num > Integer.MAX_VALUE / 10 ||
  21. (num == Integer.MAX_VALUE / 10 &&
  22. (str.charAt(i) - '0') > Integer.MAX_VALUE%10)){ //和10取余,就是判断2147483648和2147483647这两个数
  23. return sign == -1?Integer.MIN_VALUE:Integer.MAX_VALUE;
  24. }
  25. num = num * 10 + str.charAt(i) - '0'; //-'0'实现了将字符转化为数字
  26. }
  27. return num*sign;
  28. }

 

完整运行程序:

   
   
  1. /**************************************************************
  2. * Copyright (c) 2016
  3. * All rights reserved.
  4. * 版 本 号:v1.0
  5. * 题目描述: String to Integer (atoi)
  6. * mplement atoi to convert a string to an integer.
  7. * 实现atoi函数,将字符串转化为数字
  8. * 输入描述:请输入一个字符串:
  9. * 2147483649
  10. * 程序输出: 算法1转化结果为:
  11. * 2147483647
  12. * 算法2转化结果为:
  13. * 2147483647
  14. * 问题分析:1.如果字符串前几位为空字符,则应该先判断并丢弃
  15. * 2.判断字符串中的+-号,并输出相应的正负值
  16. * 3.如果字符串中间出现空格或其他字符,则不执行转换,直接退出
  17. * 4.注意判断数值越界,输出应为整数的最大值和最小值之间
  18. * 算法描述:函数首先丢弃所需的空格字符,直到找到第一个非空格字符。然后,从该字符开始,采用可选的初始加号或减号,
  19. * 后跟尽可能多的数字,并将其解释为数值。
  20. * 字符串可以包含在形成整数数字之后的附加字符,这些字符被忽略,并且对此函数的行为没有影响。
  21. * 如果str中的非空格字符的第一个序列不是有效的整数,或者如果没有这样的序列,
  22. * 因为str是空的或者它只包含空格字符,则不执行转换。
  23. * 如果不能执行有效的转换,则返回零值。如果正确的值超出可表示值的范围,
  24. * 则返回INT_MAX(2147483647)或INT_MIN(-2147483648)。
  25. * 完成时间:2016-11-16
  26. ***************************************************************/
  27. package org.GuoGuoFighting.LeetCode08;
  28. import java.util.Scanner;
  29. /*
  30. 算法1没有考虑在字符串中间出现非法字符的情况,其他情况则可以正常运行
  31. */
  32. class SolutionMethod1{
  33. public int myAtoi(String str){
  34. if(str == null || str.length() < 1){
  35. return 0;
  36. }
  37. //int i = 1;
  38. String tmp = str.replaceAll(" ", "");
  39. char first = tmp.charAt(0);
  40. /*while(first == ' '){
  41. first = str.charAt(i);
  42. i++;
  43. System.out.println("i=" + i + "first=" + first);
  44. }*/
  45. if(first == '-'){
  46. return parseString(tmp,1,false);
  47. }else if(first == '+'){
  48. return parseString(tmp,1,true);
  49. }else if(first <='9' && first >= '0'){
  50. return parseString(tmp,0,true);
  51. }else {
  52. return 0;
  53. }
  54. }
  55. public boolean isDigit(char c){
  56. return c >= '0'&&c <= '9';
  57. }
  58. public int parseString(String str,int index,boolean positive){
  59. if(index >= str.length()){
  60. return 0;
  61. }
  62. int result;
  63. long tmp = 0;
  64. while(index < str.length()&&isDigit(str.charAt(index))){
  65. tmp = tmp*10 + str.charAt(index) - '0';
  66. if(tmp > 0x8000_0000L){
  67. return Integer.MAX_VALUE;
  68. }
  69. index++;
  70. }
  71. if(positive){
  72. if(tmp >= 0x8000_0000L){
  73. return Integer.MAX_VALUE;
  74. }else if(tmp == 2147483648L){
  75. result = (int)(tmp - 1);
  76. }else{
  77. result = (int)tmp;
  78. }
  79. }
  80. else{
  81. if(tmp == 0x8000_0000L){
  82. return result = 0x8000_0000;
  83. }
  84. else{
  85. result = (int)-tmp;
  86. }
  87. }
  88. return result;
  89. }
  90. }
  91. class SolutionMethod2{
  92. public int myAtoi(String str){
  93. int num = 0;
  94. int sign = 1;
  95. final int n = str.length();
  96. if(n == 0)
  97. return 0;
  98. int i = 0; //i指向字符串的每一个字符
  99. while(i < n && str.charAt(i) == ' ') //判断是否为空字符串,去除空字符串
  100. i++;
  101. if(str.charAt(i) == '+'){
  102. i++;
  103. }
  104. else if(str.charAt(i) == '-'){
  105. sign = -1; //判断正负数的符号位
  106. i++;
  107. }
  108. for(; i < n; i++){
  109. if(str.charAt(i) < '0' || str.charAt(i) > '9') //只要在字符串中间出现非数字,则直接中断退出循环
  110. break;
  111. if(num > Integer.MAX_VALUE / 10 ||
  112. (num == Integer.MAX_VALUE / 10 &&
  113. (str.charAt(i) - '0') > Integer.MAX_VALUE%10)){ //和10取余,就是判断2147483648和2147483647这两个数
  114. return sign == -1?Integer.MIN_VALUE:Integer.MAX_VALUE;
  115. }
  116. num = num * 10 + str.charAt(i) - '0'; //-'0'实现了将字符转化为数字
  117. }
  118. return num*sign;
  119. }
  120. }
  121. public class StringtoInteger {
  122. public static void main(String[] args){
  123. System.out.println("请输入一个字符串:");
  124. Scanner scanner = new Scanner(System.in);
  125. String str = scanner.nextLine();
  126. scanner.close();
  127. SolutionMethod1 solution1 = new SolutionMethod1();
  128. System.out.println("算法1转化结果为:");
  129. System.out.println(solution1.myAtoi(str));
  130. SolutionMethod2 solution2 = new SolutionMethod2();
  131. System.out.println("算法2转化结果为:");
  132. System.out.println(solution2.myAtoi(str));
  133. }
  134. }


程序运行结果:

 算法1错误的运行结果:
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值