当我将输入设为mama
时,下面的代码会打印mamaa
,但我希望输出仅为ma
。代码
import java.util.*;
class Duplicate1 {
public static void main(String args[]) {
String str;
Scanner s=new Scanner(System.in);
System.out.println("enter the string");
str=s.nextLine();
String result="";
char c=str.charAt(0);
result=result+c;
for(int i=1; i<str.length(); i++) {
char d = str.charAt(i);
for(int j=0; j<i+1; j++) {
if(d != result.charAt(j)) {
result=result+d;
}
}
}
System.out.println(result);
}
}
答案 0 :(得分:1)
请自己做一些笔&amp;纸张测试应该看起来像这样:
init result = "m";
| i | j | d | c | comparison | result |
|---|---|---|---|------------|--------|
| 1 | 0 | a | m | a != m | ma |
| 1 | 1 | a | a | a != a | ma |
| 2 | 0 | m | m | m != m | ma |
| 2 | 1 | m | a | m != a | mam |
| 2 | 2 | m | m | m != m | mam |
| 3 | 0 | a | m | a != m | mama |
| 3 | 1 | a | a | a != a | mama |
| 3 | 2 | a | m | a != m | mamaa |
| 3 | 3 | a | a | a != a | mamaa |
和/或使用调试器,这是所有Java编辑器(NetBeans,IntelliJ,Eclipse,...)中的标准调试器,并逐步执行应用程序以了解出现问题的原因。
如果与当前处理的字符与结果字符串中的字符不匹配,您基本上要做的就是添加它。对于当前结果字符串中包含的每个非匹配字符,将d
的新字符添加到结果字符串的末尾。
相反,如果字符在结果字符串中尚不可用,则应该只添加该字符。这可以通过在外部循环中保持布尔标志found
(用false初始化)来指示是否找到匹配来完成,并且在内部循环中如果找到匹配则仅将此标志设置为true并保持迭代内部循环并在内部循环完成后检查found
标志,如果发现等于false,则仅添加当前存储在d
中的字符。
更直接的解决方案是检查当前结果字符串是否只是contains某个字符,如果不是则只添加字符。这会使内循环完全冗余。
答案 1 :(得分:0)
我可以看到一些错误。但由于这显然是一项家庭作业或其他学习练习,你需要学会找到自己的错误。所以这是一个提示。
提示:您只测试与第一个字符重复的字符。 (再次阅读你的代码。)
最后,这里有一些关于调试自己的代码的想法:
阅读您编写的代码并尝试精神上执行它,一次一个声明。你写的实际的陈述是否会做你需要他们做的事情?
学习使用调试器,以及如何单步,设置断点并查看局部变量的值。