《剑指offer》第五十题I:字符串中第一个只出现一次的字符

// 面试题50(一):字符串中第一个只出现一次的字符
// 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出
// ‘b‘。

#include <cstdio>
#include <string>

char FirstNotRepeatingChar(const char* pString)
{
    if (pString == nullptr)
        return ‘\0‘;

    const int tableSize = 256;  //char为8位, 2 ^ 8 = 256种可能
    unsigned int hashTable[tableSize]; //构建哈希表
    for (unsigned int i = 0; i < tableSize; ++i)
        hashTable[i] = 0;

    const char* pHashKey = pString; //字符串索引/哈希表key值
    //第一次遍历统计字符出现次数
    while (*(pHashKey) != ‘\0‘)
        hashTable[*(pHashKey++)] ++;  //将 ++pHasKey 结合到一句

    pHashKey = pString;
    //第二次遍历寻找出现次数为1的第一个字符
    while (*pHashKey != ‘\0‘)
    {
        if (hashTable[*pHashKey] == 1)
            return *pHashKey;

        ++pHashKey;
    }
    return ‘\0‘;
}

// ====================测试代码====================
void Test(const char* pString, char expected)
{
    if (FirstNotRepeatingChar(pString) == expected)
        printf("Test passed.\n");
    else
        printf("Test failed.\n");
}

int main(int argc, char* argv[])
{
    // 常规输入测试,存在只出现一次的字符
    Test("google", ‘l‘);

    // 常规输入测试,不存在只出现一次的字符
    Test("aabccdbd", ‘\0‘);

    // 常规输入测试,所有字符都只出现一次
    Test("abcdefg", ‘a‘);

    // 鲁棒性测试,输入nullptr
    Test(nullptr, ‘\0‘);

    return 0;
}

测试代码

分析:确实是简易哈希表。

注意牛客网是返回位置,上述代码是返回字符。

class Solution {
public:
    int FirstNotRepeatingChar(string str) {

        if (str.length() <= 0)
            return -1;

        const int tableSize = 256;
        unsigned int hashTable[tableSize];
        for (unsigned int i = 0; i < tableSize; ++i)
            hashTable[i] = 0;

        int hashKey = 0;
        while (str[hashKey] != ‘\0‘)
            hashTable[str[hashKey++]] ++;

        hashKey = 0;
        while (str[hashKey] != ‘\0‘)
        {
            if (hashTable[str[hashKey]] == 1)
                return hashKey;

            ++hashKey;
        }
        return -1;
    }
};

牛客网提交代码

原文地址:https://www.cnblogs.com/ZSY-blog/p/12638169.html

时间: 2024-10-13 22:04:14

《剑指offer》第五十题I:字符串中第一个只出现一次的字符的相关文章

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

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

《剑指Offer》替换空格(将字符串中的空格替换为%20)

题目: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为 We Are Happy.则经过替换之后的字符串为 We%20Are%20Happy. 思路: 这种替换问题要考虑是否会覆盖原字符串,若是在源字符串上直接替换. 看到这个问题我觉得很多人都会想到直接从头开始替换,即遇到空格就将其替换为%20,每次都要将空格后的字符后移两个字节.这种解法的时间复杂度为O(n^2)!!! 另外一种较好的解法是从后往前替换,具体做法是从头遍历计算所有空格数,计算出总的长度. 该解

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指offer】Q38:数字在数组中出现的次数

与折半查找是同一个模式,不同的是,在这里不在查找某个确定的值,而是查找确定值所在的上下边界. def getBounder(data, k, start, end, low_bound = False): if end < start : return -1 while start <= end: mid = ( start + end ) >> 1 if data[ mid ] > k: end = mid - 1 elif data[ mid ] < k: star

剑指offer (32) 从1到n整数中1的出现次数

题目:输入一个整数,求从1到n这个n个整数的十进制表示中1的出现次数 方法一:最直观的解法  T(n) = O(nlgn) int NumberOf1Between1AndN_Solution1(unsigned int n) { int number = 0; for(unsigned int i = 1; i <= n; ++ i) number += NumberOf1(i); return number; } int NumberOf1(unsigned int n) { int num

【剑指offer】第四题 替换空格

/** * 剑指offer 第4题 替换空格 * 特点:1.先扫描串中的空格数,计算好替换后的长度 * 2.使用双指针,从后面开始向前替换,避免从前开始每次替换后就要移动后面的所有的数据 * 测试用例:特殊:有多个空格 * 错误:数组长度不够,字符串为空 * */ package javaTrain; public class Offer4 { public static void main(String[] args) { String a = "Hello I am Daisy Dong!&

剑指offer之【表示数值的字符串】

题目: 表示数值的字符串 链接: https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100",&quo

《剑指offer》面试题28:字符串排序(牛客网版本) java

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 这里尤其需要注意2点:1.所有组合不能重复,比如输入"aa",  那么输出的结果应当是"aa" : 2. 输出结果按字典序排序 如果用<剑指offer>上的方法,显然这两点都不能满足,比如

《剑指offer》:[54]表示数值的字符串

题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数). 例如,字符串"+100","5e2","-123","3.1416"及"-1E-16"都表示数值,但"12e","1a3.14","1.2.3","+-5"及"12e+5.4"都不是.  分析:这个题主要是应用数字的表示通式来解决:表示一个数