题解 | #找出字符串中第一个只出现一次的字符#
找出字符串中第一个只出现一次的字符
https://www.nowcoder.com/practice/e896d0f82f1246a3aa7b232ce38029d4
题解:这道题我只想到了两种解决方式,一种是利用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; } }