第一个只出现一次的字符

【题目】

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始。

【思路】

遍历统计每个字符在字符串中出现的次数,把它保存在数组中,可以利用哈希算法,让字符的ASCII码与数组的键值保持一定的关系,数组的值用来保存次数,这样就形成key-value对,根据字符的ASCII值就可以找到它它在数组中保存它出现的次数的位置。

题目中是全部由字母组成,大写字母的ASCII码在65-90,小写字母在97-122之间,一共有52个字母。

【代码】


//   第一个只出现一次的字符  
    public static int FirstNotRepeatingChar(String str) {
    if(str==null||str.equals("")){
            return -1;
        }
    char[] chs=str.toCharArray();
    int[] arr=new int['z'+1];
    for(char c:chs){
        arr[(int)c]++;
    }
    for(int i=0;i<arr.length;i++){
        if(arr[(int)chs[i]]==1){
            return i;
        }
    }
    return -1;
}
    //思想同上,空间小一点,代码没那么简洁
    public static int firstNotRepeatingChar(String str){
        if(str==null||str.equals("")){
            return -1;
        }
        char[] charArr=str.toCharArray();
        int[] count=new int[58];//65-90 A-Z,97-122 a-z
        int index=-1;
        for(int i=0;i<charArr.length;i++){
                count[charArr[i]-'A']++;
        }
        for(int i=0;i<charArr.length;i++){
            if(count[charArr[i]-'A']==1){
                index=i;
                break;
            }
        }
        return index;   
    }

   //运行有错!!!!
    public int FirstNotRepeatingChar(String str)  
        {  
            int index = -1;//如果字符串为空返回-1  
            if(str != null )  
            {  
                char [] charArray = str.toCharArray();//将字符串转换成字符数组  
                int[] count = new int[52];//创建一个int型长度为52的数组,用来保存每个字母出现的次数  

                //第一次遍历字符串,更新字母出现次数(根据字母找到数组的位置将值+1)  
                for (int i = 0; i < charArray.length; i++)  
                {  
                    //如果字母在65-90之间,在数组中的位置为ASCII-65,并将次数+1  
                    if(charArray[i]>=65 && charArray[i]<=90)  
                    {  
                        count[charArray[i] - 65]++;  
                    }  
                    //如果字母在97-112之间,在数组中的位置为ASCII-71,并将次数+1  
                    if(charArray[i]>=97 && charArray[i]<=112)  
                    {  
                        count[charArray[i] - 71]++;  
                    }  
                }  

                //第二次遍历字符串,查找字母出现次数(根据字母找到次数保存在count数组中的位置得到出现的次数)  
                for (int i = 0; i < charArray.length; i++)  
                {  
                    //如果字母在65-90之间,在数组中的位置为ASCII-65,并将次数+1  
                    if(charArray[i]>=65 && charArray[i]<=90)  
                    {  
                        if(count[charArray[i] - 65] == 1)  
                            {  
                              index = i;  
                              break;  
                            }  
                    }  
                    //如果字母在97-112之间,在数组中的位置为ASCII-71,并将次数+1  
                    if(charArray[i]>=97 && charArray[i]<=112)  
                    {  
                        if(count[charArray[i] - 71] == 1)  
                            {  
                              index = i;  
                               break;  
                            }  
                    }  

                }  

            }  
            return index;  
        }  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值