开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
题目来源:leetcode-cn.com/leetbook/re…
题目
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。(s 只包含小写字母)
输入: s = "loveleetcode"
输出: 2
输入: s = "aabb"
输出: -1
思路分析
第一种解法:通过枚举解决,使用一个数组来记录每个元素出现次数,先统计每个字符出现的次数,第二遍再次从前往后遍历字符串s中的每个字符,如果某个字符出现一次直接返回,原来比较简单,看下代码如 l 出现2次,那么可以在数组 ary[1] = 2,然后遍历数组中值为1 就是的位置就是结果。
如果不使用数组,也可以使用一个键值对象,比如 hashmap。然后统计每个字母出现的次数,最后再去查找其在数组中的所在位置。
另外一种比较简单的解法,就是利用语言已经提供的方法,比如 find 方法去查询,得到2条数据都忽略,只有一个的即是输出结果。
代码实现
function func_exerise8 (s){
let res = {}
let data = s.split('')
for(let i=0;i<data.length;i++){
if(res[data[i]]){
res[data[i]]++;
}else{
res[data[i]] = 1;
}
}
for(let i=0;i<data.length;i++){
if(res[data[i]]==1){
return i;
}
}
}
双指针解题
双指针也称为快慢,是指两个指针同时从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。
该题的题型和之前的数组中找唯一值是相同。所以其实也是可以使用双指针的方式遍历找到唯一的值。这样的效率应该会更高的,一前一后的指针进行遍历。
public int firstUniqChar(String s) {
int i=0;
int j=1;
int len=s.length();
for(;j<len;j++){
if(i!=j){
if(s.charAt(i)==s.charAt(j)){
i++;
j=-1;
}
}
if(i==len)
return -1;
}
return i;
}