一 . 问题描述
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
二 . 解题思路
这段代码的目标是找到字符串 s 中第一个不重复的字符,并返回它的索引。如果不存在这样的字符,则返回 -1。以下是代码的逐步逻辑:
-
统计字符频率:
-
将字符串
s转换为字符数组arr。 -
使用
LinkedHashMap按插入顺序统计每个字符的出现次数。
-
-
查找第一个频率为 1 的字符:
-
遍历
LinkedHashMap,找到第一个值为1的字符c。
-
-
返回字符
c的索引:-
再次遍历字符串
s,找到字符c第一次出现的索引。
-
三 . 解题过程
public static int firstUniqChar(String s) {
char[] arr = s.toCharArray();
LinkedHashMap<Character, Integer> hashMap = new LinkedHashMap<>();
for (char name : arr) {
if (hashMap.containsKey(name)) {
int count = hashMap.get(name);
count++;
hashMap.put(name, count);
} else {
hashMap.put(name, 1);
}
}
char c = ' ';
int temp = 0;
Set<Map.Entry<Character, Integer>> entries = hashMap.entrySet();
for (Map.Entry<Character, Integer> entry : entries) {
int count = entry.getValue();
if (count == 1) {
temp++;
c = entry.getKey();
break;
}
}
if (temp == 0) {
return -1;
}
for (int i = 0; i < s.length(); i++) {
if (c == s.charAt(i)) {
return i;
}
}
return -1;
}
四 . 时间复杂度和空间复杂度
1 . 时间复杂度是 O(n)。
2 . 空间复杂度是 O(n)。
五 . 自我反思(优化建议)
-
减少遍历次数:
当前代码遍历了字符串 2 次(统计频率 + 查找索引),可以合并为 1 次遍历。 -
避免
如果只需要字符频率,可以用普通LinkedHashMap的额外空间:HashMap+ 额外遍历字符串来保证顺序。 -
利用数组代替
如果字符集较小(如 ASCII 字符),可以用固定大小的数组统计频率,空间更优。HashMap:

被折叠的 条评论
为什么被折叠?



