https://blog.csdn.net/guliguliguliguli/article/details/126089434
https://www.nowcoder.com/exam/oj/ta?difficulty=2&page=1&pageSize=50&search=&tpId=13&type=265
使用Map来记录每个字符的出现次数;LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的
只要找到出现次数为1的字符,就是用indexOf方法找出它在此字符串中第一次出现处的索引,需要注意的是,indexOf中需要传入String,而不是char,所以使用+""
的方式将char变成String
import java.util.LinkedHashMap;
import java.util.Map;
public class Solution {
public int FirstNotRepeatingChar(String str) {
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
/*
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}*/
map.put(c, map.getOrDefault(c, 0) + 1);
}
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
return str.indexOf(entry.getKey() + "");
}
}
return -1;
}
}
HashMap和方案一的LinkedHashMap一样,都是用来记录每一个字符出现的次数的,与LinkedHashMap不同的是:HashMap不能记录插入的顺序,所以在统计完每个字符出现的次数以后,不是遍历map,而是再一次遍历String str,当遇到某一字符在map中记录的出现的次数为1的时候,返回该索引
import java.util.HashMap;
public class Solution {
public int FirstNotRepeatingChar(String str) {
HashMap<Character, Integer> map = new HashMap<>();
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);
}
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
if (map.get(c) == 1) {
return i;
}
}
return -1;
}
}