剑指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语言的都知道,所有就没有用。

posted @ 2018-09-12 15:20  轻抚丶两袖风尘  阅读(137)  评论(0编辑  收藏  举报