思路1:暴力法,扫描到哪个字符直接扫描之后的所有字符,查看有没有重复的,没有重复的直接返回。
(太简单了,不写了)
思路2:遍历字符,将字符保存到hashMap中,Key表示字符,Value表示出现的次数。再一次遍历字符,通过Key寻找Value,当发现Vaule为1时,直接返回。
时间复杂度:O(n)
空间复杂度:O(n)
HashMap<Character,Integer> map = new HashMap();
for(int i = 0;i < s.length();i++){
char temp = s.charAt(i);
if(map.containsKey(temp)){
map.put(temp,map.get(temp)+1);
}else{
map.put(temp,1);
}
}
//再次遍历字符串,只要出现value=1的就直接返回即可
for(int i = 0 ; i < s.length();i++){
char temp = s.charAt(i);
if(map.get(temp) == 1) return temp;
}
return ' ';
思路3:
题目中给定的字符也不过是26个字符,创建26个字符对应的数组,当扫描到对应的字符时直接在对应的位置进行+1即可。最后在扫描一次字符串,当对应的数组位置的值为1时,直接返回即可。
时间复杂度 O(n)
空间复杂度 O(26) 固定消耗。如果给定的字符是ASCLL码那就定义128,如果是Unicode那就定义256。
char ans = ' ';
//创建字典
int[] dir = new int[26];
//a -> 0号下标,b -》 1号下标
//第一次遍历将字符串中的字符出现的次数存入到字典中
for(int i = 0 ;i < s.length();i++){
dir[s.charAt(i) - 'a']++;
}
//再次扫描字符串,获取字典中的次数,当出现次数为1时,直接返回。
for(int i = 0; i < s.length();i++){
if(dir[s.charAt(i)- 'a'] == 1) return s.charAt(i);
}
return ans;