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;
}
我有一份学校作业,我需要编写一个函数来接收一个字符串和一个字母。然后它复制字符串中的字母并 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;
}