【问题标题】:Java duplicate character in string issue字符串问题中的Java重复字符
【发布时间】:2020-09-06 21:41:33
【问题描述】:

我有一个学校作业,我需要创建一个接收字符串和字母的函数。然后它复制字符串中的字母并返回它。例如,如果我这样调用函数 System.out.println(duplicate("hello world", "l"));,它应该输出你好世界。但是,当我进行此调用时,代码改为输出 hello wlorld。这是我的代码:

  public static String duplicate(String s, String letter){
    String rv = s;
    for(int i=0; i<s.length(); i++){
      String a = s.substring(i,i+1);
      if (letter.compareTo(a) == 0){
        rv = rv.substring(0, i) + a + rv.substring(i);
      }
    }
    return rv;
  }

【问题讨论】:

  • 就个人而言,我会使用StringBuilder 之类的东西来创建新的String
  • 很好的建议@MadProgrammer,您可以在给定索引处的字符之后插入。
  • @MadProgrammer 不幸的是,我无法使用 stringbuilder 来完成这项任务。我只能使用 compareTo、子字符串、长度和 indexOf
  • 为什么不比较 s.charAt(i) == letter 而不是 letter.compareTo(a) == 0,其中 letter 是 char 类型。在可以获得可用字符的地方使用 `s.substring(i, i + 1) 没有多大意义,除非您 需要 使用字符串。
  • @Jason assingment 规定我们必须使用字符串

标签: java string substring


【解决方案1】:

因此,一个非常快速的案头检查将突出潜在问题...

+----+---+----+
|  i | a | rv |
+----+---+----+
| 00 | h |  h |
| 01 | e |  e |
| 02 | l |  l |
| 03 | l |  l |
| 04 | o |  l |
| 05 |   |  l |
| 06 | w |  o |
| 07 | o |    |
| 08 | r |  w |
| 09 | l |  o |
| 10 | d |  o |
+----+---+----+

问题是,“插入”点没有被正确更新,而不是通过已经进行的更改数量来偏移位置,您只是继续使用当前的搜索索引。

我个人的偏好是使用StringBuilder,但由于您不能这样做,因此无论如何都遵循相同的通用方法的超简单方法可能看起来像...

public static String duplicate(String s, String letter) {
    String rv = "";
    for (int i = 0; i < s.length(); i++) {
        String a = s.substring(i, i + 1);
        if (letter.compareTo(a) == 0) {
            rv += a;
        }
        rv += a;
    }
    System.out.println(rv);
    return rv;
}

但是,如果您不允许这样做,那么您需要根据在其之前插入的其他字符的数量来跟踪每个新字符所需的“偏移量”,例如...

public static String duplicate(String s, String letter) {
    String rv = s;
    int delta = 0;
    for (int i = 0; i < s.length(); i++) {
        String a = s.substring(i, i + 1);
        if (letter.compareTo(a) == 0) {
            rv = rv.substring(0, i + delta) + a + rv.substring(i + delta);
            delta += 1;
        }
    }
    System.out.println(rv);
    return rv;
}

【讨论】:

    【解决方案2】:

    如果可以使用 indexOf,则不需要遍历 for 循环中的所有字符。

        int i = 0;
        while (true) {
            int index = s.indexOf(letter, i);
            if(index == -1 ) return s;
            s = s.substring(0, index) + letter + s.substring(index);
            i = index + 2;
        }
    

    【讨论】:

      【解决方案3】:

      考虑到您的所有限制,这是我能想到的。

      public static String duplicate(String s, String letter){
          String ans = "";
          for (int i = 0; i < s.length(); i++) {
              String sub = s.substring(i, i + 1);
              if(sub.compareTo(letter) == 0)
                  ans += sub + sub;
              else 
                  ans += sub;
          }
          return ans;
      }
      

      正如评论部分所建议的,StringBuilder 是首选方式

      public static String duplicate(String s, String letter){
          StringBuilder ans = new StringBuilder();
          for (int i = 0; i < s.length(); i++) {
              String sub = s.substring(i, i + 1);
              if(sub.compareTo(letter) == 0)
                  ans.append(sub + sub);
              else 
                  ans.append(sub);
          }
          return ans.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-12
        • 2021-10-29
        • 2014-03-25
        • 2012-09-26
        • 1970-01-01
        • 2010-12-25
        • 2019-03-15
        • 1970-01-01
        • 2014-11-21
        相关资源
        最近更新 更多