第一个只出现一次的字符(java)
题目描述:
在字符串s中找出第一个只出现一次的字符。如果没有,返回一个单空格。s只包含小写字母。
样例:
输入:s = “abaccdeff”
输出:‘b’
输入:s = “”
输出:’ ’
输入:s = “abbacdcdff”
输出:’ ’
题解:
“只出现一次”说明与前有关与后有关,所以要掌握整个字符串的状态,可以把字符串中的字符存进哈希表,键为字符,值为出现的次数。出现的次数只有两种状态:一次或者多次。出现多次的就不是我们要的,可以以false代之;如此,出现一次的就以true代指。存进表里之后,再次遍历字符串,找到第一个键值为true的字符,就是答案。
代码:
public static char firstUniqChar(String s) {
//字符串中第一个只出现一次的字符
if(s == "")
return ' ';
Map map = new HashMap();
//把字符串中的字符放进哈希表中
for(int i = 0; i < s.length(); i ++) {
if(map.containsKey(s.charAt(i))) {
//出现过一次以上的将其键值改为false
map.put(s.charAt(i), false);
}else {
map.put(s.charAt(i), true);
}
}
for(int i = 0; i < s.length(); i ++) {
//遍历字符串中的字符,找出第一个键值为true的字符
if(map.get(s.charAt(i)).toString() == "true") {
return s.charAt(i);
}
}
return ' ';
}
代码不简练,来看精选:
巧妙利用哈希表键值的boolean类型性质,我竟还傻了吧唧的用个toString()。
public static char firstUniqChar(String s) {
HashMap<Character, Boolean> dic = new HashMap<>();
char[] sc = s.toCharArray();
for(char c : sc)
//哈希表中不存在,键值就为true;表中已经存在,键值就为false
dic.put(c, !dic.containsKey(c));
for(char c : sc)
if(dic.get(c)) return c;
return ' ';
}