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

9q78igpj  于 2021-07-04  发布在  Java
关注(0)|答案(3)|浏览(301)

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

xhv8bpkk1#

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

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

pdsfdshx2#

所以,一个真正快速的案头检查将突出潜在的问题。。。

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

问题是,“insert”点没有正确更新,您只是继续使用当前的搜索索引,而不是用已经进行的更改的数量来抵消位置。
我个人倾向于使用 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;
}
ifmq2ha2

ifmq2ha23#

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

相关问题