题解:这道题我只想到了两种解决方式,一种是利用LinkedHashMap,采取时间换空间的方法,同时也保证可以顺序遍历;一种是利用位图,用空间来换时间。参考别人的解决方式时,发现String的replaceAll() 方法有些刁钻,感觉也挺不错的。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner scanner = new Scanner(br);
String str = scanner.nextLine();
Object result = getFirstCharacterAppearsOnlyOnce3(str);
System.out.println(result);
}
// 使用String的replaceAll方法解决
private static Object getFirstCharacterAppearsOnlyOnce3(String str) {
if (str == null || str.length() == 0) return -1;
for (int i = 0; i < str.length(); i++) {
String s = str.replaceAll(str.substring(i, i + 1), "");
if (str.length() - s.length() == 1){
return str.substring(i,i+1);
}
}
return -1;
}
// 使用位图解决
private static Object getFirstCharacterAppearsOnlyOnce2(String str) {
if (str == null || str.length() == 0) return -1;
int[] chars = new int[126];
for (int i = 0; i < str.length(); i++) {
chars[str.charAt(i) - '0']++;
}
for (int i = 0; i < str.length(); i++) {
if (chars[str.charAt(i) - '0'] == 1) {
return str.charAt(i);
}
}
return -1;
}
// 使用LinkedHashMap解决
private static Object getFirstCharacterAppearsOnlyOnce1(String str) {
if (str == null || str.length() == 0) return -1;
LinkedHashMap<Character, Integer> hashMap = new LinkedHashMap<>();
for (int i = 0; i < str.length(); i++) {
Character ch = str.charAt(i);
if (hashMap.containsKey(ch)){
hashMap.replace(ch,hashMap.get(ch)+1);
}else{
hashMap.put(ch,1);
}
}
Set<Character> keySet = hashMap.keySet();
for (Character ch :
keySet) {
if (hashMap.get(ch) == 1)
return ch;
}
return -1;
}
}

京公网安备 11010502036488号