Java字符串中的重复字符问题
我有一个学校作业,我需要做一个函数,接受一个字符串和一个字母。然后它复制字符串中的字母并返回它。例如,如果我像这样调用函数Java字符串中的重复字符问题,java,string,substring,Java,String,Substring,我有一个学校作业,我需要做一个函数,接受一个字符串和一个字母。然后它复制字符串中的字母并返回它。例如,如果我像这样调用函数 System.out.println(重复(“hello world”、“l”),它应该输出hellllo-worlld。但是,当我进行此调用时,代码反而输出Helllo wlorld。这是我的密码: public static String duplicate(String s, String letter){ String rv = s; for(i
System.out.println(重复(“hello world”、“l”)代码>,它应该输出hellllo-worlld。但是,当我进行此调用时,代码反而输出Helllo 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;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=s;
对于(inti=0;i,考虑到所有的约束条件,这就是我能想到的
公共静态字符串重复(字符串s、字符串字母){
字符串ans=“”;
对于(int i=0;i
正如评论部分所建议的,StringBuilder是首选方法
公共静态字符串重复(字符串s、字符串字母){
StringBuilder ans=新的StringBuilder();
对于(int i=0;i
考虑到您的所有限制,这是我能想到的
公共静态字符串重复(字符串s、字符串字母){
字符串ans=“”;
对于(int i=0;i
正如评论部分所建议的,StringBuilder是首选方法
公共静态字符串重复(字符串s、字符串字母){
StringBuilder ans=新的StringBuilder();
对于(int i=0;i
如果可以使用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;
}
如果可以使用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;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=“”;
对于(int i=0;i
但是,如果您不允许这样做,那么您需要跟踪每个新字符所需的“偏移量”,例如,基于在其前面插入的其他字符数
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;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=s;
int delta=0;
对于(int i=0;i
因此,快速的案头检查将突出潜在问题
+----+---+----+
| 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;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=“”;
对于(int i=0;i
但是,如果您不允许这样做,那么您需要跟踪每个新字符所需的“偏移量”,例如,基于在其前面插入的其他字符数
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;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=s;
int delta=0;
对于(int i=0;i
就我个人而言,我会使用类似于StringBuilder的东西来创建新的字符串
很好的建议@MadProgrammer,您可以在给定索引的字符后插入。@MadProgrammer不幸的是,我无法使用StringBuilder来完成此任务。我只能使用compareTo、substring、length和indexOfIns代替字母。比较到(a)==0
为什么不比较s.charAt(i)==letter
其中letter
是char类型。使用's.substring(i,i+1)没有多大意义除非您需要使用字符串,否则您可以从中获得可用字符。@Jason任务规定我们必须亲自使用StringBuilder,我会使用类似于StringBuilder的东西来创建新的字符串