第一种解法:
import java.util.Scanner;
import java.util.HashMap;
/*
* 用HashMap记录字符出现的次数,然后重新遍历一次,算法比较简单,但是空间复杂度和时间复杂度很高
*/
public class CharStatistics2 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String s = scan.next();
System.out.println(firstChar(s));
}
}
public static char firstChar(String s){
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(map.containsKey(c)){
int count = map.get(c) + 1;
map.put(c, count);
}
else
map.put(c, 1);
}
for(int i = 0; i < s.length();i++){
if(map.get(s.charAt(i)) ==1)
return s.charAt(i);
}
return ' ';
}
}
第二种解法:
import java.util.Scanner;
/*
* 思路:因为字符的ASCII码值是从0到255,所以建一个大小为256的int数组,初始值为-1。
* 然后遍历字符串中的每个字符,以字符的ascii码为索引去取数组的值,如果值为-1,表明它
* 是第一次出现,将数值的值赋值为当前的索引。如果值大于等于0,表明不是第一次出现,则将数组值
* 置为-2。
* 字符串遍历完后,去找数组中值不小于0中最小的值即为所要找的字符的位置。
* 时间复杂度为O(N),N为字符流的长度,空间复杂度为256*4bytes
*/
public class CharStatistics {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String s = scan.next();
System.out.println(firstIndex(s));
}
}
public static char firstIndex(String s){
int[] indexArray = new int[256];
for(int i = 0; i < indexArray.length; i++)
indexArray[i] = -1;
for(int i = 0; i < s.length(); i++){
if(indexArray[s.charAt(i)] == -1)
indexArray[s.charAt(i)] = i;
else if (indexArray[s.charAt(i)] >= 0)
indexArray[s.charAt(i)] = -2;
}
int index = Integer.MAX_VALUE;
for(int i = 0; i < indexArray.length; i++){
if(indexArray[i] >= 0 && indexArray[i] < index)
index = indexArray[i];
}
if(index == Integer.MAX_VALUE) return ' ';
else return s.charAt(index);
}
}
第三种解法:
如果可以重复遍历字符串,并且要求空间复杂度很低,可以用2bit来表示字符出现的次数,00表示未出现,01表示出现1次,11表示出现多次,然后遍历字符串,找到第一个是01的字符。