【问题标题】:string a to i problem on leetcode my solution fails incase of 2 consecutive signsleetcode 上的字符串 a 到 i 问题我的解决方案在 2 个连续符号的情况下失败
【发布时间】:2021-09-27 10:59:19
【问题描述】:

问题链接:https://leetcode.com/problems/string-to-integer-atoi/ 我已经实现了我的解决方案,但是对于像“-+42”这样的测试用例它失败了,因为字符串中出现了 2 个连续的符号。我需要在我的代码中做哪些更改,我哪里错了?帮助将不胜感激

我的代码:

 class Solution {
    public int myAtoi(String s) {
      s=s.trim();
        char sign='+';
        
      if (s.length()==0) return 0;
        String digit="";
        for(int i=0;i<s.length();i++)
        {
            //checking for sign
             if(s.charAt(i)=='-'||s.charAt(i)=='+')
                sign=s.charAt(i);
            //checking for all non digit characters
            else if((s.charAt(i)>='a'&& s.charAt(i)<='z')||(s.charAt(i)>='A' && s.charAt(i)<='Z')||(s.charAt(i)==' ')||(s.charAt(i)=='.')||(s.charAt(i)=='-')||(s.charAt(i)=='+'))
           
            break;
            
             else{
                 digit=digit+s.charAt(i);
             }   
            
        }
        if(digit=="") return 0;
        
            
        //System.out.print(sign);
        try{
        int n=(Integer.parseInt(digit));
            //int a=Integer.parseInt(digit);
            System.out.print(sign);
            if(sign=='-')
            return (-n);
            return n;
        }
        //check for out of range for integer
        catch(NumberFormatException e)
        {
            if(sign=='-')
               
            {
                //
                int n=Integer.MIN_VALUE;
             return n;}
            
            else
            {
                int n=Integer.MAX_VALUE;
                return n;
            }
        }
                
          
    }
}

【问题讨论】:

  • 了解它抛出了什么错误以及发生在哪一行会很有帮助。
  • 也许你应该在循环外检查-+,而不是在循环内。
  • 您可以从实际按照挑战中给出的说明开始,例如仅跳过前导空格(trim() 不仅删除空格),仅查找和处理单个前导符号字符(不要在循环中重复执行),并且仅收集数字(例如代码也收集 $ 字符) .

标签: java string loops


【解决方案1】:

呃,只是.. 做练习所说的?不确定您想从这里听到什么。我猜:“你能把这个问题反刍给我吗”。可以!

您的算法并没有像练习中说明您需要做的那样做任何事情。您正在触发出现在任何地方的符号字符,并且您的代码会扫描字母,所有这些都是练习没有提到的。完全没有。该练习提到了“不是数字”和第一个字符的概念(在去掉空格之后,您已经通过 trim() 调用做到了这一点)。

所以,按照练习中所说的去做:

您的代码需要涉及s.charAt(0) 而不是if (s.charAt(i) == '-' - 只有3 个选项:

  • 修剪后的字符串以+ 开头。将符号设置为 +,然后从位置 1 开始查看数字。
  • 修剪后的字符串以- 开头。将符号设置为 -,然后从位置 1 开始查看数字。
  • 也没有。将符号设置为 + 并从位置 0 开始查看数字。

您的s.charAt(i) &gt;= 'a' 也是错误的。你不是在找信。你正在寻找任何不是数字的东西。 + 不是一封信。尽管如此,在输入-5+10 中,您应该返回-5。在 -+10 中,您应该返回 0。(因为这就像 -hello - 没有数字的负值,即负零,也就是零)。

我认为练习的目的不是使用Integer.parseInt

试试这个算法:

  • 如果你的字符是&gt;= '0'&lt;= '9',你可以减去'0'得到整数形式的实际数字:char c = '5'; int y = c - '0'; System.out.println(y);会打印出5。
  • 将现有输入乘以 10,然后加上您拥有的数字。换句话说,对于文本输入"29",首先你读到一个2,你将你正在处理的数字(最初是0)乘以10(仍然是0),然后你加上2,给你 2。然后你得到另一个数字,所以你将到目前为止的值乘以 10(给你 20),然后加上数字值,得到整数 29。不需要parseInt
  • 您现在需要在您的工作总翻转标志出现在您身上时进行夹紧。因此,如果突然间您的输入为负数(因为您自己直到最后都不会将其设为负数),您知道您必须根据符号值钳制并返回 Integer.MIN_VALUEInteger.MAX_VALUE

【讨论】:

  • 谢谢!我仍然是一个初学者并正在努力改进,所以这绝对有帮助,我终于明白了我的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2020-11-25
  • 2011-10-15
  • 2022-01-13
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多