【问题标题】:I'm not getting why they put 0 there as when we do char(i-1). It should show some error我不明白为什么他们把 0 放在那里,就像我们做 char(i-1) 一样。它应该显示一些错误
【发布时间】:2018-05-25 11:11:05
【问题描述】:

示例输入 0

aaabccddd

样本输出 0

abd

我找到了这个解决方案

static String super_reduced_string(String s) 
{
    int i;


    String s1="Empty String";

    StringBuffer ss = new StringBuffer(s);

    for(i = 1; i < ss.length(); i++) {
        if(ss.charAt(i) == ss.charAt(i-1)) {
            ss.deleteCharAt(i);
            ss.deleteCharAt(i-1);
            i = 0;
        }
    }
    String str2 = ss.toString();
    if(ss.length() == 0) 
        return s1;
    else 
        return str2;
}

我不明白为什么i = 0 在代码中,因为当ss.CharAt(i - 1) 行运行时,编译器应该显示一些错误,但代码工作正常。

【问题讨论】:

  • 我没有看到明确的问题陈述。当前输出是您想要的吗?无论如何,这个输出背后的逻辑是什么?
  • 我想知道他们为什么放 i=0?
  • 你试过运行代码吗?它在语义上是正确的,因此 compiler 不会显示错误。但是当它运行时,它很可能会以ArrayIndexOutOfBoundsException 退出。
  • 我注意到您的问题仍然是“开放的”:您没有接受答案。请查看并决定是否要accept 回答。或者让我知道我是否可以做些什么来增强我的输入以使其被接受。接受有助于未来的读者确定问题是否得到解决,并对花时间回答你的人表示感谢。

标签: java string algorithm char


【解决方案1】:

基本上这是一种重新开始循环的丑陋方式。

这确保在删除字符后,循环再次从 0 开始。

郑重声明:这是不好的做法,整个代码示例就像“不要编写这样的代码”声明。那几行使用错误的命名,它们具有误导性,隐藏意图而不是传达意图。

【讨论】:

  • 循环是否每次都重新评估 ss.length() ?
  • @Sylvain 可能
  • 代码中的另一个问题是循环原本不是从0开始,而是从1开始,不可读,容易出错,我100%同意“不要写这样的代码” "。
  • 是的,这段代码写得不好。除此之外,它不需要从零开始:它可以从 i-2 继续(除非 i == 1)
【解决方案2】:

i = 0 在满足if 条件时设置,然后for 循环将i 增加1 所以i = 1

因此,当到达 ss.CharAt(i - 1) 时,它会在位置 0 找到 char

【讨论】:

    【解决方案3】:

    for(i = 1; i &lt; ss.length(); i++) 在下一次迭代之前递增i,所以i=0 在循环的底部。 AS 它回到for(i = 1; i &lt; ss.length(); i++) 然后i++ 被应用所以

    if(ss.charAt(i) == ss.charAt(i-1))
    

    变成

    if(ss.charAt(1) == ss.charAt(1-1))
    

    【讨论】:

      【解决方案4】:

      上面的for循环等价于:

      i = 1;
      while (i < ss.length()) {
          if(ss.charAt(i) == ss.charAt(i-1)) {
              ss.deleteCharAt(i);
              ss.deleteCharAt(i-1);
              i = 0;
          }
          i++;
      }
      

      如您所见,i 在设置为零后立即递增。

      也就是说,代码写得不好(参见@GhostCat 的回答);可以这样写:

      static String super_reduced_string(String s) 
      {
          int i;
      
          String s1="Empty String";
      
          StringBuilder ss = new StringBuilder();
      
          for(char c: s.toCharArray()) {
              int len = ss.length();
              if(len == 0 || c != ss.charAt(len-1)) {
                  ss.append(c);
              } else {
                  ss.deleteCharAt(len-1);
              }
          }
          String str2 = ss.toString();
          if(ss.length() == 0) 
              return s1;
          else 
              return str2;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        • 2011-09-25
        • 2016-08-24
        • 2011-03-02
        相关资源
        最近更新 更多