空间换时间 - 50.第一个只出现一次的字符

在这里插入图片描述

思路1:暴力法,扫描到哪个字符直接扫描之后的所有字符,查看有没有重复的,没有重复的直接返回。
(太简单了,不写了)

思路2:遍历字符,将字符保存到hashMap中,Key表示字符,Value表示出现的次数。再一次遍历字符,通过Key寻找Value,当发现Vaule为1时,直接返回。
时间复杂度:O(n)
空间复杂度:O(n)

      HashMap<Character,Integer> map = new HashMap();
        for(int i = 0;i < s.length();i++){
            char temp = s.charAt(i);
            if(map.containsKey(temp)){
                map.put(temp,map.get(temp)+1);
            }else{
                map.put(temp,1);
            }
        }

       //再次遍历字符串,只要出现value=1的就直接返回即可
       for(int i = 0 ; i < s.length();i++){
            char temp = s.charAt(i);
            if(map.get(temp) == 1) return temp;
       }
       return ' ';

思路3:
题目中给定的字符也不过是26个字符,创建26个字符对应的数组,当扫描到对应的字符时直接在对应的位置进行+1即可。最后在扫描一次字符串,当对应的数组位置的值为1时,直接返回即可。
时间复杂度 O(n)
空间复杂度 O(26) 固定消耗。如果给定的字符是ASCLL码那就定义128,如果是Unicode那就定义256。

 char ans = ' ';
        //创建字典
        int[] dir = new int[26];
        //a -> 0号下标,b -》 1号下标
        //第一次遍历将字符串中的字符出现的次数存入到字典中
        for(int i = 0 ;i < s.length();i++){
            dir[s.charAt(i) - 'a']++;
        }
        //再次扫描字符串,获取字典中的次数,当出现次数为1时,直接返回。
        for(int i = 0; i < s.length();i++){
            if(dir[s.charAt(i)- 'a'] == 1) return s.charAt(i);
        }
        return ans;
原创文章 139 获赞 23 访问量 5909

猜你喜欢

转载自blog.csdn.net/weixin_44916741/article/details/104788465