zoukankan      html  css  js  c++  java
  • 【剑指Offer-时间效率与空间效率的平衡】面试题50:第一个只出现一次的字符

    题目描述

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

    思路1

    遍历字符串,判断当前字符是否在当前字符之后出现过,也就是需要两个循环,时间复杂度为O(n^2)。

    思路2

    使用哈希表,并遍历两遍字符串。第一次遍历字符串时,记录每个字符出现的次数,由于字符范围为0~255,所以可以把一个长度为256的数组作为哈希表。第二次遍历字符串时,根据哈希表判断该字符出现的次数是否为1,是的话返回即可。代码如下:

    class Solution {
    public:
        int FirstNotRepeatingChar(string str) {
            if(str.length()==0)
                return -1;
            
            int dict[256];
            memset(dict, 0, sizeof(dict));
            for(int i=0; i<str.length(); i++)
                dict[str[i]]++;
    
            for(int i=0; i<str.length(); i++){
                if(dict[str[i]]==1)
                    return i;
            }
            return -1;
        }
    };
    

    该算法遍历了两次字符串,时间复杂度为O(n),在运行过程中没有申请新的内存,空间复杂度为O(1)。

  • 相关阅读:
    xml 创建 和 处理 及其修改
    shutil模块(高级的文件copy)
    shelve模块使用说明
    random内置模块
    time 时间内置模块3种形态的转化
    python模块说明
    Java控制并发线程数的Semaphore
    Java并发测试
    JAVA 模拟瞬间高并发
    java并发--流量控制demo
  • 原文地址:https://www.cnblogs.com/flix/p/12516322.html
Copyright © 2011-2022 走看看