在字符串中找出第一个只出现一次的字符

这道题好像出自《剑指offer》。我这本书还没有开始看,要找机会看看。

在一个长为字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
数据范围:字符串只有字母组成。
要求:空间复杂度 O(N),时间复杂度 O(N)
举例:
输入 “google”,输出 4
输入 “aa”,输出 -1

这道题的一个前提基础知识就是要知道一些Collection和Map类常用方法的时间复杂度,参考Java集合类常用方法时间复杂度。
还有根据这篇博客,String类的charAt的时间复杂度也是 o ( 1 ) o(1) o(1)

public class CheckCharAppearOnce {
    public static void main(String[] args) {
        System.out.println("input String");
        System.out.println(checkFirstAppearIndex(new Scanner(System.in).nextLine()));
    }

    private static int checkFirstAppearIndex(String inputStr) {
        int num = 0;
        Set<Character> ExistCharSet = new HashSet<>();
        for(int i = 0;i <inputStr.length();i++ ){
            if(!ExistCharSet.add(inputStr.charAt(i))){
                ExistCharSet.remove(inputStr.charAt(i));
            }
        }
        if(ExistCharSet.isEmpty()){
            return -1;
        }
        for(int i = 0;i <inputStr.length();i++ ){
            if(ExistCharSet.contains(inputStr.charAt(i))){
                return i;
            }
        }
        return -1;
    }
}

HashMap(哈希表)的增删改查是非常快的,时间复杂度就是 O ( 1 ) O(1) O(1)。数据结构使用HashMap和HashSet应该都是可以的。

顺便贴上几个前辈的博客:
【Java】 剑指offer(50-1) 字符串中第一个只出现一次的字符
算法之如何找出字符串中第一个只出现一次的字符?(Java实现)剑指offer(我用了类似第三种方法)

总之基础是很重要的,要多看书多练习。

收获:

  1. 命名要规范,有意义。注意可读性,要见名知意。变量就不要命名为set,s之类的东西了。
  2. 第二次遍历之前可以用if判断还需不需要第二次遍历。当时想到了但是觉得代码量越少越好就没写,直接用后面一个return -1代替。实际上不是代码越少越好,而是性能越高越好。

你可能感兴趣的:(小练习,哈希算法,java,算法)