题目:找出字符串中第一个只出现3次的字符
分析:
举个例子,“bbcccdddbc”应该返回d,而不是b。这个题目有个容易混淆的地方,“第一个出现”怎么衡量?应该以最后一次出现的位置为准,而不是第一次出现的位置。比方说上面的字符串d就比b最后一次出现的早,d是在位置7,而b是位置8。
代码:
使用两个数组和两趟遍历:
private static char f(String s){
int[] count = new int[256];
int[] lastIndex = new int[256];
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
count[c]++;
if(count[c] == 3){
lastIndex[c] = i;
}
}
int min = Integer.MAX_VALUE;
for(int i = 0; i < 256; i++){
if(count[i] == 3){
min = Math.min(min, lastIndex[i]);
}
}
return s.charAt(min);
}
一个数组记录次数,另一个记录位置。
也可以使用一个数组:
private static char f(String s){
int[] count = new int[256];
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(count[c] == 2){
count[c] = -i;
} else if (count[c] < 0){
count[c] = 4;
} else {
count[c]++;
}
}
int min = Integer.MAX_VALUE;
for(int i = 0; i < 256; i++){
if(count[i] < 0){
min = Math.min(min, -count[i]);
}
}
return s.charAt(min);
}
当次数为3时,就转而记录位置而是不是次数。
在想能否只用一个数组加一趟遍历完成。