题目:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。如果字符串为空,返回-1
测试用例:
- 功能测试:数组中存在或者不存在只出现一次的字符。
- 特殊测试:数组中全部都是只出现一次的字符。
- 负面测试:输入是数组为空。
方法一:暴力法,时间复杂度为 O(n²)。
思路:一个循环遍历数组中每一个字符,另一个循环比较拿遍历到的字符与后面的字符作比较,如果后面没有发现重复的字符,则该字符就是只出现一次的字符。
方法二:利用一个哈希表,以空间换时间,时间复杂度为 O(n),空间复杂度为O(1)。
思路:
- 第一次循环找到数组中每一个字符出现的次数,并用哈希表对应表示,map<charAt(i),time>,时间为 O(n)。
- 第二次循环是为了找到第一个只出现一次的字符,时间为 O(1)。
import java.util.LinkedHashMap;
public class test_fifty {
public int FirstNotRepeatingChar(String str){
LinkedHashMap<Character,Integer> map = new LinkedHashMap<Character,Integer>();
//第一次循环找到数组中每一个字符出现的次数,并用哈希表对应表示
for(int i=0; i < str.length();i++){
if(map.containsKey(str.charAt(i))){
int time = map.get(str.charAt(i));
map.put(str.charAt(i), ++time); //这里注意要先自增再赋值
}
else{
map.put(str.charAt(i), 1); //只出现一次的字符
}
}
//第二次循环是为了找到第一个只出现一次的字符
for(int i =0; i < str.length(); i++){
char c = str.charAt(i);
if(map.get(c) == 1){
return i;
}
}
return -1;
}
}