剑指offer (35) 第一个只出现一次的字符 字符哈希表

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

题解分析:用空间换时间,使用哈希表,key为字符,value是该字符出现的次数

字符是一个长度为8的数据类型,因此总共只有256种可能,我们可以创建一个长为256的数组,

每个字符根据其ASCII码值作为数组的下标,即哈希表的key,而相应数组位置存储每个字符出现的次数,即哈希表的value

char GetFirstOnce(const char* str)
{
    assert(str != NULL);
    const int hashSize = 256;
    int hash[hashSize] = { 0 };
    const char* cur = str;
    while (*cur != ‘\0‘) {
        hash[*cur]++;
        ++cur;
    }

    cur = str;
    while (*cur != ‘\0‘) {
        if (hash[*cur] == 1) {
            return *cur;
        }
        ++cur;
    }
    return ‘\0‘;
}

相关问题:

1. 输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符

void Delete(char* str1, const char* str2) {
    assert(str1 != NULL || str2 != NULL);
    const int hashSize = 256;
    int hash[hashSize] = { 0 };
    const char* cur2 = str2;
    while (*cur2 != ‘\0‘) {
        hash[*cur2] = 1;
        ++cur2;
    }

    char* cur1 = str1;
    while (*str1 != ‘\0‘) {
        if (hash[*str1] == 0) {  // 没有出现在str2中,依次保存
            *cur1 = *str1;
            ++cur1;
        }
        ++str1;
    }
    *cur1 = ‘\0‘;
}

2. 删除字符串中重复出现的字符,例如 “google”,执行函数之后应该是“gole”

首先将哈希表中所有value设为false,第一次扫描到‘g‘时,ASCII码下标对应的value为false,表示第一次出现,加入到res中,然后将value设为true,其后扫描到‘g‘时直接跳过

void DelDup(char* str) {
    assert(str != NULL);
    const int hashSize = 256;
    bool hash[hashSize] = { false };

    char* cur = str;
    char* res = str;
    while (*cur != ‘\0‘) {
        if (hash[*cur] == false) {
            *res = *cur;
            ++res;
            hash[*cur] = true;
        }
        ++cur;
    }
    *res = ‘\0‘;
}

剑指offer (35) 第一个只出现一次的字符 字符哈希表

时间: 2024-08-24 13:39:39

剑指offer (35) 第一个只出现一次的字符 字符哈希表的相关文章

【剑指offer】第一个只出现一次的数

def FirstNotRepeatingChar(string): hashStr = [0] * 256 for c in string: hashStr[ord(c)] += 1 for c in string: if hashStr[ord(c)] == 1: return c 这里说下ord, 可以作为atoi来用,功能是若给定的参数是一个长度为1的字符串,那么若参数是Unicode对象,则返回对应的整数,若为8-bit的string,则返回对应的值. python的帮助文档里举例:

剑指OFFER之第一个只出现一次的字符(九度OJ1283)

题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1. 样例输入: ABACCDEFF AA 样例输出: 1 -1 解题思路: 首先考虑到时间复杂度,对字符串进行排序或者双层扫描都会到达O(nlong)---O(n^2)的地步. 所以我们考虑额外使用一个数组进行计数,线性时间扫描数组,然后再按照原来的顺序扫描数组找到次数为

【剑指offer】第一个只出现一次的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27106997 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1. 样例输入: ABACCDEFF AA 样例输出: 1 -1 处理字符串中重复或者次数出现等问题,最常用的就是哈希表,用字符串中的字符作为key,

【剑指Offer】第一个只出现一次的字符位置

问题描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置.若为空串,返回-1.位置索引从0开始. 示例: 输入:sabcdsdf 输出:1 算法描述 定义一个52个元素的整型数组aCount,初始化为0,每个字母(大小写)依次对应一个,记录字母出现的次数: 定义一个52个元素的整型数组aPos,初始化为-1,每个字母(大小写)对应一个,记录字母第一次出现的位置: 每次遍历一个到字母,aCount数组里对应字母加1,判断目前aCount数组里该字

《剑指offer》第一个只出现一次的字符位置

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出

[剑指offer] 34. 第一个只出现一次的字符

题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 一次遍历存储到哈希表 一次遍历取Value为1的第一个字符的索引 class Solution { public: int FirstNotRepeatingChar(string str) { int len = str.size(); if (len == 0) return -1; map<char, int> ma

剑指offer[34]——第一个只出现一次的字符

题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 这道题目我的思路很简单,就是遍历字符串,然后判断遍历到的字母是否在它之前和之后的字符串出现过,没有的话就直接返回,有的话就继续计算. function FirstNotRepeatingChar(str) { const _length = str.length; if(_length==0){return -1;} let temp

【剑指offer】数组中只出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3

【剑指offer】删除在另一个字符串中出现的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.如何判断那些字符是需要删除的字符.同很多字符串问题一样,可以开辟