暴力解法
两个循环
hashmap + 两个循环
public int solution_1(String s){
if(s==null || s.length()==0){
return -1;
}
Map<Character, Integer> record = new HashMap<>();
// 第一次进行遍历主要是关注统计数目相关的情况等信息
for(int i=0;i<s.length();i++){
record.put(s.charAt(i), record.getOrDefault(s.charAt(i),0)+1);
}
//第二次遍历统计个数等于1的情况
for(int i =0;i<s.length();i++){
if(record.get(s.charAt(i))==1){
return i;
}
}
return -1;
}
一个辅助数组 + 两个循环
充分利用数组的特性情况进行记录, 将数组的下标转换为标记一个字母
a -----z 单词
0------ 25 数组下标
数组内容
1,2 ==== 对应单词的出现次数情况
public int solution_3(String s){
if(s==null || s.length()==0){
return -1;
}
int [] hashtable = new int[26];
// 字母与数字之间的映射关系,就是第一个字母
for( int i=0;i<s.length();i++){
// 说白了就是利用数组坐标来标记一个字母吗,就类似于在hashmap 我们需要两个结构来标记一个数组的基本情况一样
hashtable[s.charAt(i)-'a']++;
}
for(int i=0;i<s.length();i++){
if(hashtable[s.charAt(i)-'a']==1)
{return i;}
}
return -1;
}
充分利用数组下标
充分利用数组下标与来记录每个单词
比如int [26]
index =0 对应字母 a 就跟map 当中的key一样 int [index] 代表map当中的value
class Solution {
public int firstUniqChar(String s) {
if(s==null || s.length()==0)
return -1;
int [] result = new int[26];
for(int i=0;i<s.length();i++){
// 进行统计计数这种心情看过
result[s.charAt(i)-'a']++;
}
// 遍历整个字符串的基本情况内容
for(int i=0;i<s.length();i++){
// 进行统计计数这种心情看过
if(result[s.charAt(i)-'a']==1)
return i;
}
return -1;
}
}