题目
给定一个字符串
s
,找到
它的第一个不重复的字符,并返回它的索引
。如果不存在,则返回
-1
。
解法一:用哈希表存储频数
对于这种找重复的问题,我们可以很自然地想到Map,key存字母,value存频数。这里我们学习一下Map中getOrDefault()这个方法的使用,这个方法只需要使用一次就可以减少一次if-else的使用。不用再判断是否存在key值,如果存在得到key对应的value然后加一,如果不存在就把对应的key和0put进去。而是直接使用该方法,如果存在就置value为后面的值,如果不存在就值默认值。
同时我们还要注意一下第二次循环找数,如果直接使用map的for-each遍历,会导致找不到对应的下标(我第一次就是因为使用了for-each循环而走投无路,最后又改成存索引wuuuuuuuu。。。)
class Solution {
public int firstUniqChar(String s) {
Map<Character, Integer> hm = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
hm.put(ch, hm.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < s.length(); ++i) {
if (hm.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
}
解法二:用哈希表存数索引
和第一种大同小异
class Solution {
public int firstUniqChar(String s) {
HashMap<Character,Integer> m = new HashMap<>();
for(int i = 0;i < s.length();i++){
if(m.containsKey(s.charAt(i))){
m.put(s.charAt(i),-1);
}
else{
m.put(s.charAt(i),i);
}
}
for(int i = 0;i<s.length();i++){
if(m.get(s.charAt(i)) != -1){
return i;
}
}
return -1;
}
}
解法三:使用String类自带库函数
只要正数和倒数的下标一致,证明就只出现一次。
class Solution {
public int firstUniqChar(String s) {
for(int i = 0;i < s.length();i++){
char a = s.charAt(i);
if(s.indexOf(a) == s.lastIndexOf(a)){
return i;
}
}
return -1;
}
}
版权声明:本文为littlest_white原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。