题目描述:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。
* 若为空串,返回-1。位置索引从0开始
解法一:
public int FirstNotRepeatingChar(String str) { if(str==null) return -1; int address=0; char[] ch = str.toCharArray();//保存每个字符的数组 //LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。 LinkedHashMap<Character,Integer> hash = new LinkedHashMap<Character,Integer>(); for(int i=0;i<ch.length;i++){ if(hash.containsKey(ch[i])){ hash.put(ch[i], hash.get(ch[i])+1);//将item出现的次数加1; }else{ hash.put(ch[i], 1); } } /*for(char key:hash.keySet()){ if(hash.get(key)==1){ return key;//这里是返回第一个只出现一次的字符,那么他的位置? } }*/ for(int i=0;i<ch.length;i++){ if(hash.get(ch[i])==1) return i; } return -1; }
解法二:不占用内存
public int FirstNotRepeatingChar(String str) {//当字符串的字母大小写都一致的情况,要么全是大写,要么全是小写。 if (str.length() == 0) { return -1; } char c = 'A';//初始化c,是从A开始,65 if(str.charAt(0) >= 'a'){ c = 'a';//如果第一个字母是小写,则从a开始,97 } int[] counts = new int[26];//字符间的差值不会大于26 for (int i = 0; i < str.length(); i++) { counts[str.charAt(i) - c]++;//表示 } for (int i = 0; i < str.length(); i++) { if (counts[str.charAt(i) - c] == 1){ return i; } } return -1; }