【LeetCode】第一个只出现一次的字符Java题解
题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
s = "abaccdeff"
返回 "b"
s = ""
返回 " "
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
这个题目题意简单,难点是返回第一个只出现一次的字符。
首先,我们可以使用 hashMap 来存储每个字符出现的次数。然后在重新遍历字符串就可以得出答案。代码如下:
代码
public char firstUniqChar(String s) {
Map map = new HashMap<>();
for (char ch : s.toCharArray()) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
Set set = new HashSet<>();
for (Map.Entry entry : map.entrySet()) {
if (entry.getValue() == 1) {
set.add(entry.getKey());
}
}
char ans = ' ';
if (set.size() > 0) {
for (char ch : s.toCharArray()) {
if (set.contains(ch)) {
ans = ch;
break;
}
}
}
return ans;
}
这个题目虽然不难,但是一不小心就容易写出冗余低效的代码。写出精简,高效的代码还是需要多练习。优化后的代码如下:
public char firstUniqChar(String s) {
int[] cnt = new int[256];
char[] chars = s.toCharArray();
for (char ch : chars) {
cnt[ch]++;
}
char ans = ' ';
for (char ch : chars) {
if (cnt[ch] == 1) {
ans = ch;
break;
}
}
return ans;
}
总结
上述代码的时间复杂度是 O(n), 空间复杂度是O(n)
上述优化的代码,主要使用 ASCII 码思想优化。
简单介绍一下ASCII 码相关知识。在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)。而 ASCII 码就是存储的通用规范。ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号,其中 32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
坚持每日一题,加油!