【leetcode C语言实现】剑指 Offer 50. 第一个只出现一次的字符

题目描述

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例:

s = “abaccdeff”
返回 “b”

s = “”
返回 " "

限制:

0 <= s 的长度 <= 50000

解题思路

遍历两次字符串,第一次记下每一个字符出现的次数,第二次遍历时,第一次出现次数为1的即为所求字符。

代码

char firstUniqChar(char* s){
    if((s == NULL) || (strlen(s) == 0))
        return ' ';

    int hash_array[256] = {0};
    char *p = s;
    while((*p) != '\0')
    {
        hash_array[*p]++;
        p++;
    }
        
    p = s;
    while(*p != '\0')
    {
        if(hash_array[*p] == 1)
        {
            return *p;
        }
        p++;
    }

    return ' ';
}

测试代码及结果

#include<stdio.h>
#include<string.h>

char firstUniqChar(char *s);

int main(void)
{
    // 功能测试
    char str1[] = "abaccdeff";  // 字符串中存在只出现一次的字符
    char res1 = firstUniqChar(str1);
    printf("res1 = %c\n", res1);

    char str2[] = "adaccdff";  // 字符串不存在只出现一次的字符
    char res2 = firstUniqChar(str2);
    printf("res2 = %c\n", res2);

    char str3[] = "adcdf";  // 字符串中所有字符都只出现一次
    char res3 = firstUniqChar(str3);
    printf("res3 = %c\n", res3);

    // 特殊输入测试
    char *str4 = NULL;
    char res4 = firstUniqChar(str4);
    printf("res4 = %c\n", res4);

    return 0;
}

在这里插入图片描述

执行结果

时间复杂度:O(n),空间复杂度:O(1)。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sunshine_hanxx/article/details/107646750