第一个只出现一次的字符位置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一个只出现一次的字符位置相关的知识,希望对你有一定的参考价值。

题目描述:在一个字符串(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;
    }

 

以上是关于第一个只出现一次的字符位置的主要内容,如果未能解决你的问题,请参考以下文章

第一个只出现一次的字符位置-剑指Offer

剑指offer34:第一个只出现一次的字符的位置

第一个只出现一次的字符位置

第一个只出现一次的字符位置

剑指offer-第一个只出现一次的字符

第一个只出现一次的字符位置