刚刚做了一道编程题,我把题目简化如下:
给定一个只包含小写字母和#的字符串,其中#代表退格字符,要求把处理后的字符串输出。例如,输入:ab#c,输出:ac;输入:ab##,输出为空;输入:#a#c,输出:c。
我的程序如下:
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
String s=sc.next();
StringBuffer sb1=new StringBuffer(s);
for(int i=0;i<sb1.length()-1;i++)
{
while(sb1.charAt(0)=='#')
sb1.deleteCharAt(0);
if(sb1.charAt(i)=='#')
{
sb1.delete(i-1,i+1);
i=-1;
}
}
System.out.println(sb1);
}
}
问题在于,我输入ab##,输出却是a#,调试后发现是for循环出问题,判断条件即使为真也退出了循环,应该怎么修改?
把i<sb1.length()-1改成i<=sb1.length()-1 或者i< sb1.length()就可以了
你这个错误在于把长度和索引搞混淆了
长度是4 时候索引是最大是3 你长度-1了 那么就说明你索引的最后一位永远取不到了
这是我写的方法,应该能满足你的这个需求。
public static void fun(String s) {
String regex = "[a-z]#";
Set<String> set = new HashSet<>();
boolean flag = true;
while (flag) {
s = s.replaceAll(regex, "");
flag = set.add(s);
}
System.out.println(s.replaceAll("#", ""));
}
public static void fun(String s) {
String regex = "[a-z]#";
Set set = new HashSet<>();
boolean flag = true;
while (flag) {
s = s.replaceAll(regex, "");
flag = set.add(s);
}
System.out.println(s.replaceAll("#", ""));
}
用递归函数
static String delTest(String str)
{
if(str.contains("#"))
{
if(str.startsWith("#"))
return delTest(str.substring(1));
int index = str.indexOf('#');
return delTest(String.format("%s%s", str.substring(0, index - 1), str.substring(index + 1)));
}else{
return str;
}
}
你的逻辑有问题,你的循环 i++,但是可变字符串一直在变化