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


    题目描述:在一个字符串(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;
        }
  • 相关阅读:
    ubuntu linux切换用户到root
    passwd命令
    如何根据驱动程序及其安装文件来访问该设备[转]
    CMMI的5个级别和25个过程域
    Linux操作系统启动过程
    VMWare上网三种工作模式
    卷积的意义【转】
    Linux内核模块动态添加方法
    Linux内核编译的过程
    mysql存入中文乱码解决方法(windows环境)
  • 原文地址:https://www.cnblogs.com/tjuxqcui/p/5541377.html
Copyright © 2020-2023  润新知