在Java中查找第一个无重复字符时出错
我有一个奇怪的问题,打印字符串中的第一个非重复字符 如果我把例如“sasso”作为字符串,它会正确地返回:“a” 但如果我尝试使用“sassa”,我想知道为什么它会回复我:“s”在Java中查找第一个无重复字符时出错,java,algorithm,loops,char,Java,Algorithm,Loops,Char,我有一个奇怪的问题,打印字符串中的第一个非重复字符 如果我把例如“sasso”作为字符串,它会正确地返回:“a” 但如果我尝试使用“sassa”,我想知道为什么它会回复我:“s” 公共类FirstChar{ 公共字符findFirst(字符串s){ 布尔[]字母=新布尔[26]; char[]firstLetter=新字符[26]; 对于(int i=0;i
公共类FirstChar{
公共字符findFirst(字符串s){
布尔[]字母=新布尔[26];
char[]firstLetter=新字符[26];
对于(int i=0;i
}您需要确保firstLetter充当非重复字符的队列,并在遇到重复字符时将其从队列中删除。您总是在第0或第1位置返回字符,而不覆盖第一个字母数组元素。 如果是
sassa
,当遇到最后一个字符a
时,firstif
中的条件求值为true,从而返回存储在firstLetter数组中的第一个字符s
。
对于
“sassa”
,您需要HashMap和Queue来实现这一点,您期望得到什么?您知道返回的是字符中的哪一个吗?您是否尝试过在调试器中逐行遍历代码?也许你应该?我想:“a”是第一个不重复的字符,所以“重复”是指“连续重复”?您仍然应该尝试在调试器中单步执行代码,以查看它的功能。如果@Someprogrammerdude,则在两个测试用例中都应该是“s”时“连续重复”是正确的。除了这里的问题之外,此方法中还有一些问题。只要没有重复的字符,您总是得到第二个字符。所以“soup”返回“o”。“abcdefghijklmnop”返回“b”。只要有一个重复的字符,你总是得到第一个字符。所以“abcdefgghijklmnop”返回“a”。“aaabcdefgghijklmnop”也返回“a”,即使“a”在重复。逐步完成代码并仔细评估它正在做什么以及您期望它做什么。您是对的!我想对我来说是时候开始研究这些收藏品了。
public class FirstChar {
public char findFirst(String s) {
boolean[] letters = new boolean[26];
char[] firstLetter = new char[26];
for (int i = 0; i < s.length(); i++) {
if (letters[s.charAt(i) - 97] &&
(firstLetter[0] != (s.charAt(i)))) {
System.out.println( firstLetter[0]);
return firstLetter[0];
}
letters[s.charAt(i) - 97] = true;
char c = (char) (s.charAt(i));
firstLetter[i] = c;
}
System.out.println(firstLetter[1]);
return firstLetter[1];
}
public static void main(String args[]) {
FirstChar obj = new FirstChar();
obj.findFirst("sassa");
}