String input = "AAAB";
String output = "";
for (int index = 0; index < input.length(); index++) {
if (input.charAt(index % input.length()) != input
.charAt((index + 1) % input.length())) {
output += input.charAt(index);
}
}
System.out.println(output);
但如果我的输入是“ABABAB”或只是“AAAA”,它就不起作用。有什么想法吗?
答案 0 :(得分:4)
使用数据结构来了解是否已找到某个角色,例如Set
。例如,您可以使用其add()
方法并检查其返回值。
另外,您可以考虑使用StringBuilder
进行重复连接,效率更高。
Set<Character> characters = new HashSet<Character>();
String input = "AAAB";
StringBuilder output = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
char character = input.charAt(index);
if (characters.add(character)) {
output.append(character);
}
}
System.out.println(output.toString());
答案 1 :(得分:1)
针对速度版本进行了优化
public static void main(String[] args) {
String input = "AAAB";
StringBuilder output = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
if (!contains(output, input.charAt(i))) {
output.append(input.charAt(i));
}
}
System.out.println(output);
}
private static boolean contains(StringBuilder output, char c) {
for(int i = 0; i < output.length(); i++) {
if (output.charAt(i) == c) {
return true;
}
}
return false;
}
答案 2 :(得分:0)
(我希望你的意思是重复,而不是重复。)
public static String withoutDuplicates(String s) {
for (int i = 0; i < s.length(); ) {
boolean removedDuplicate = false;
for (int duplicateLength = (s.length() - i) / 2; duplicateLength >= 1;
--duplicateLength) {
if (foundDuplicate(s, i, duplicateLength)) {
s = s.substring(0, i) + s.substring(i + duplicateLength);
removedDuplicate = true;
break;
}
}
if (!removedDuplicate) {
++i;
}
}
return s;
}
private static boolean foundDuplicate(String s, int i, int duplicateLength) {
String sought = s.substring(i, i + duplicateLength);
return s.indexOf(sought, i + duplicateLength) != -1;
}
更正: duplicateLength初始化值超出范围。
答案 3 :(得分:0)
让我们来看看你的循环在做什么:
if (input.charAt(index % input.length()) != input
.charAt((index + 1) % input.length()))
1)首先,您应该通过执行'%input.length()'操作来识别您正在浪费时间和处理能力,因为索引总是小于input.length(),所以索引%input.length()始终等于index。
让我们忽略%input.length()。
2)当你将input.charAt(index)与input.charAt(index + 1)进行比较时,你只是将当前字符与下一个字符进行比较。原始问题,如果我理解正确的话,会要求您删除所有副本,而不仅仅是那些彼此相邻的副本。
3)你的算法最有可能抛出一个IndexOutOfBounds异常,因为当你到达字符串的末尾时(当index == input.length()时) - 1)检查input.charAt(index + 1)也会看到一个字符远在String。
正如第一个答案建议的那样,您需要利用某种形式的数据结构来存储您遇到的所有DISTINCT字符。每当你点击一个新角色时,你都会想要a)将它添加到你的数据结构中,b)将它添加到你的输出的末尾。
答案 4 :(得分:0)
public static void print(String s) {
List<String> v = new ArrayList<String>();
for(int j=0; j<s.length(); j++) {
if(!v.contains("" + s.charAt(j)))
v.add("" + s.charAt(j));
}
for(String e : v)
System.out.print(e);
}