题目链接:
思路:利用ASCII码映射,将每个字符出现的次数以及最后出现的位置存储进二维数组,然后重新遍历二维数组,找出次数为1且出现位置最小的,返回此位置就ok,复杂度O(n)
实现源码;
package niuke; /** * a-z:97-122 * A-Z:65-90 */ public class 第一个只出现一次的字符 { public int FirstNotRepeatingChar(String str) { if(str.length()==0||str==null)return 0; int[][] statistic = new int[53][2]; //mapping ASCII,first is times,second is location char[] temp = str.toCharArray(); for(int i = 0;i<temp.length;++i){ if(temp[i]>=97) { int trans = temp[i] - 96; statistic[trans][0] += 1; statistic[trans][1] = i; }else{ int trans = temp[i] - 38; statistic[trans][0] += 1; statistic[trans][1] = i; } }//statistic is over int min = 54; // char res = '#'; for(int i = 1;i<53;++i){ if(statistic[i][0]==1&&statistic[i][1]<min){ min = statistic[i][1]; // res = (char)i; } } if(min==54) return -1; else return min; } }
代码已AC
希望对大家有所帮助
以上