剑指Offer第二十三题:第一个只出现一次的字符
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。
题目分析
这个题目很简单,我记得在学c语言的时候就玩过。
方法一:你可以定义一个256长度的int数组array,一个循环 array[str.charAt(i)]++;最后寻找出第一个值为1的值,就是答案了。
方法二:我的思路是:使用循环遍历字符串再HashMap存储他的值,字符串值作为key值,下标作为value值;在遍历的时候判断哈希表中是否已经存在,如果存在,删除其中的key-value键值对映射对,然后使用一个新的HashMap存储删除的映射(为什么要存储删除的?),在遍历判断不存在在哈希表1的情况下,判断是不是在哈希表二的情况,不在,则存储在哈希表1,在什么都不做。
源代码
1 public static int FirstNotRepeatingChar(String str) { 2 HashMap<String,Integer> map=new HashMap<>(); 3 HashMap<String,Integer> map2=new HashMap<>(); 4 for(int i=0;i<str.length();i++) { 5 if(map.containsKey(str.charAt(i)+"")) { 6 map.remove(str.charAt(i)+""); 7 map2.put(str.charAt(i)+"", map.get(str.charAt(i)+"")); 8 }else { 9 if(!map2.containsKey(str.charAt(i)+""))//googglk,这个字符串,如果不这样做将返回的是4,然而正确的是5,l值, 10 map.put(str.charAt(i)+"", i); 11 } 12 } 13 14 Iterator iterator=map.entrySet().iterator(); 15 int min=Integer.MAX_VALUE; 16 while(iterator.hasNext()) { 17 Map.Entry<String, Integer> entry=(Map.Entry)iterator.next(); 18 if(entry.getValue()<min) { 19 min=entry.getValue(); 20 } 21 } 22 23 if(min==Integer.MAX_VALUE) 24 return -1; 25 else 26 return min; 27 }
我没有使用方法一的原因是:估计学过c语言的都知道,所有就没有用。