第一次只出现一次的字符

第三十三题:第一次只出现一次的字符

 

题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

 

思路:

        暴力解:

                           ①遍历 对每个字符进行判断(是否再次出现)

                           ②这里需要进行遍历的嵌套(双重遍历)

                           缺点:如果字符串太长,那么比较的时间太耗时

 

具体实现代码如下:

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        // 代码的鲁棒性
        if(str.length() == 0){
            return -1;
        }
        // 第一次是为了取比较的值
        for(int i = 0;i < str.length();i++){
            // 取到比较的值后,进行逐一比较
            for(int j = 0;j < str.length();j++){
                if(str.charAt(i) == str.charAt(j) && i != j){
                    // 只要找了相同的值就退出循环(前提是两个值的位置不是同一个)
                    break;
                }
                // 如果没有找到与比较字符相同的,就说明该字符是第一个只出现一次的字符
                if(str.charAt(i) != str.charAt(j) && j == str.length()-1){
                    return i;
                }
            }
        }
        return -1;
    }
}

 

思路:

        Hash表解:

                               ①遍历 存放在Hash表中(LinkedHashMap)

                               ②key = 字符    value = 字符出现的次数

                               ③最后只要返回第一个 value = 1的字符即可

 

具体实现代码如下:

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        // 代码的鲁棒性
        if(str.length() == 0){
            return -1;
        }
        // Hash表
        Map<Character,Integer> map = new LinkedHashMap<>();
        for(int i = 0; i < str.length();i++){
            char a = str.charAt(i);
            // hash表中不存在字符,就进行存储
            if(!map.containsKey(a)){
                map.put(a,1);
            }else {
                // hash表中存在字符,就进行 value +1
                map.put(a,map.get(a)+1);
            }
        }
        for (int i = 0; i < str.length(); i++){
            // 获取第一个 value = 1 的字符
            if (map.get(str.charAt(i)) == 1){
                return i;
            }
        }
        return -1;
    }
}

 

NowCoder(Online Coding, Please Click)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值