Java 字符串中的重复字符问题

Java duplicate character in string issue

我有一份学校作业,我需要编写一个函数来接收一个字符串和一个字母。然后它复制字符串中的字母并 returns 它。例如,如果我这样调用函数 System.out.println(duplicate("hello world", "l"));,应该输出hellllo world。但是,当我确实进行此调用时,代码反而会输出 hellllo 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;
  }

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

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();
}

如果可以使用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;
    }

因此,真正快速的案头检查将突出根本问题...

+----+---+----+
|  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;
}