小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
复制代码
提示:你可以假定该字符串只包含小写字母。
题解
1.使用map存储元素和出现的次数(如果出现多次,直接记为2,减少读取消耗的时间), 然后再次循环字符串,找到第一个次数为1的元素.返回索引位置.
char[] chars = s.toCharArray();
HashMap<Character, Integer> characterIntegerHashMap = new HashMap<>();
for (int i = 0; i <chars.length ; i++) {
if (characterIntegerHashMap.containsKey(chars[i])) {
characterIntegerHashMap.put(chars[i],2);
}
else {
characterIntegerHashMap.put(chars[i],1);
}
}
for (int i = 0; i <chars.length ; i++) {
if (1 == characterIntegerHashMap.get(chars[i])) {
return i;
}
}
return -1;
复制代码
- 使用数组作为存储比map查找快很多.
将元素存放到26为字母的数组的对应位置,使其+1. 再次循环,根据字符串的元素找到对应位置的次数,==1返回
public static int firstUniqChar(String s) {
char[] chars = s.toCharArray();
int[] array = new int[26];
int temp = chars.length;
int value = 0;
for (int i = 0; i <chars.length ; i++) {
// 用二十六位的数组记录重复的次数,存入次数的位置即相距a的距离
array[chars[i] - 'a'] ++;
}
for (int i = 0; i <chars.length ; i++) {
// 再次按照字符串的顺序进行遍历,找到第一个次数为1的元素
if (array[chars[i] - 'a'] == 1) {
return i;
}
}
return -1;
}
复制代码