🐕给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
提示:你可以假定该字符串只包含小写字母。
🐖思路一:
使用两个 hashMap(tempMap、targetMap) 遍历字符数组
如果 字符没存入过 两个map都存,如果字符之前已经存入过 ,targetMap移除此字符
最后判断 targetMap是否为空 如果不为空 遍历此 targetMap 取出最小value 并返回
如果 为空 则返回 -1
上代码
public static int firstUniqChar(String s) {
//如果字符串为空字符串 则直接返回 -1
if(s == null || s == " ") {
return -1;
}
//将字符串转换为字符数组
char[] array = s.toCharArray();
//如果此字符数组的长度为1 则直接返回0位置即可
if(array.length == 1) {
return 0;
}
//两个map 一个 tempMap、一个targetMap
Map<Character,Integer> map = new HashMap<>();
Map<Character,Integer> resMap = new HashMap<>();
for(int i = 0; i < array.length; i++) {
//如果tempMap没存入过此字符
if(!map.containsKey(array[i])) {
//两个map都存入此字符 + 对应下标位置
map.put(array[i], i);
resMap.put(array[i], i);
}else {
//如果之前存入过此字符 targetMap移除此字符
resMap.remove(array[i]);
}
}
//判断targetMap是否为空 如果不为空 取出最小值 返回
if(!resMap.isEmpty()) {
Set<Character> keySet = resMap.keySet();
Iterator<Character> it = keySet.iterator();
int res = Integer.MAX_VALUE;
while(it.hasNext()){
Integer itNext = resMap.get(it.next());
if(itNext < res) {
res = itNext;
}
}
return res;
}
return -1;
}

🐒思路二:两次循环 计数数组实现
因为题意说只有26个小写字母 所以我们建立一个26容量的 计数数组count
遍历字符 在count数组对应的位置上++
最后遍历一次 charCount数组 如果 array[i] - 'a’位置上 的 value为1则输出返回
上代码
public static int firstUniqCharV2(String s) {
//如果字符串为空字符串 则直接返回 -1
if(s == null || s == " ") {
return -1;
}
//将字符串转换为字符数组
char[] array = s.toCharArray();
//如果此字符数组的长度为1 则直接返回0位置即可
if(array.length == 1) {
return 0;
}
int[] charCount = new int[26]; //因为题意说只有26个小写字母
for(int i = 0 ; i < array.length; i++) {
charCount[array[i] - 'a'] ++;
}
//遍历一次 charCount数组 如果 array[i] - 'a'位置上 的 value为1则输出返回
for(int i = 0; i < array.length; i++) {
if(charCount[array[i] - 'a'] == 1) {
return i;
}
}
return -1;
}

🐒思路三:用一个HashMap 遍历字符存入 map 其中value随着字符的重复而自增,最后再次遍历map 从头开始判断字符数组的次数是否为1 是则返回 当前指针
上代码
public static int firstUniqCharV3(String s) {
//如果字符串为空字符串 则直接返回 -1
if(s == null || s == " ") {
return -1;
}
//将字符串转换为字符数组
char[] array = s.toCharArray();
//如果此字符数组的长度为1 则直接返回0位置即可
if(array.length == 1) {
return 0;
}
Map<Character,Integer> map = new HashMap<>();
//遍历字符数组 存入 map集合 value随着 key的重复而自增
for(int i = 0 ; i < array.length ; i++) {
map.put(array[i], map.getOrDefault(array[i], 0)+1);
}
//遍历map 从字符数组的0位置开始遍历 判断是否 在map的value 为1 如果是 返回指针i
for(int i = 0 ; i < array.length ; i++) {
if(map.get(array[i]) == 1) {
return i;
}
}
return -1;
}

1306

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



