标签:
字符串、List、Hash
题目:
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
反思:
这个题目如果自己好好想一下的话,只要想出了方法的话,不会那么难。
方法一
- step 1:先将字符串转成List(具体如何转换见我另一篇博客:Java字符串编程小技巧)
- step 2:然后遍历每一个字符,找出集合中首次出现和最后出现的索引,比较索引值是否为1即可
- step 3:遍历结束都没有找到,就返回-1
方法二(巧妙,要学会这种方法)
另外看到其他人的解法中有一个比较巧妙的方法,其中最重要的就是利用hash的key来记录字符出现的次数
具体步骤:
- step 1:遍历一次字符串,对于每个字符,放入哈希表中统计出现次数。
- strp 2:再次遍历字符串,对于每个字符,检查哈希表中出现次数是否为1,找到第一个即可
- step 3:遍历结束都没有找到,就返回-1
用到的知识点:
字符串、List、Hash
代码:
方法一
public class Solution {
public int FirstNotRepeatingChar(String str) {
List<Character> collect = str.chars().mapToObj(c -> (char) c).collect(
Collectors.toList());
for (int i = 0; i < collect.size(); i++) {
int indexOne = collect.indexOf(Character.valueOf(collect.get(i)));
int lastIndexOf = collect.lastIndexOf(Character.valueOf(collect.get(i)));
if (indexOne == lastIndexOf) {
return indexOne;
}
}
return -1;
}
}
方法二
public int FirstNotRepeatingChar2(String str) {
HashMap<Character, Integer> map = new HashMap<>();
// 统计每个字符出现的次数
for (int i = 0; i < str.length(); i++) {
map.put(str.charAt(i), map.getOrDefault(str.charAt(i), 0) + 1);
}
// 找到第一个只出现一次的字母
for (int i = 0; i < str.length(); i++) {
if (map.get(str.charAt(i)) == 1) {
return i;
}
}
return -1;
}