欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在字符串中找出第一个只出现一次的字符。经典C语言例题

程序员文章站 2022-05-24 19:04:58
原题要求: 在字符串中找出第一个只出现一次的字符。 如输入“abaccdeff”,则输出'b'。   思考过程:字符串中字...

原题要求:

在字符串中找出第一个只出现一次的字符。

如输入“abaccdeff”,则输出'b'。

 

思考过程:字符串中字符有很多,只出现一次的也有很多,最直接简单的方法就是记录下每个字符出现的个数,然后从第一个字符开始看,找出第一个只出现一次的字符。

程序实现:

方法一:当字符数组比较小时,便利每个元素:

 

/*  题目:在字符串中找出第一个只出现一次的字符。
   *   如输入“abaccdeff”,则输出'b'。
  */
#include<stdio.h>
#include<stdlib.h>
int find_f(char arr[],const int len)  //寻找函数
{
    int i, j, k;
    int arr1[20] = { 0 };     //定义一个储存每个字符出现次数的数组,
    for (i = 0; i < len; i++)   //对字符数组元素进行遍历,并记录该字符出现次数
    {
        k = 0;
        for (j = 0; j < len; j++)
        {
            if (arr[i] == arr[j])
                k++;
            arr1[i] = k;
        }
    }
    for (i = 0; i < len; i++)  //从第一个开始访问,找出第一个只出现一次的字符,返回该字符在原数组的下标
    {
        if (arr1[i] == 1)
        {
            return i;
        }
    }
    return len + 1;  //如果没有单独出现的字符,返回一个不是下标的数
}

int main()
{
    char arr[] = "abaccdeff";
    int len = sizeof(arr) / sizeof(arr[0]), c;
    c = find_f(arr, len);
    if (c > len)
        printf("这个字符串组数中没有只出现一次的字符\n");
    else
        printf("输入字符串中第一次出现的字符是:%c\n", arr[c]);
    system("pause");
    return 0;
}

 

 

方法二:当字符数组比较大时,记录每个字符出现的个数(用哈希表,具体方法:我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。)

代码:

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define tableSize 256      //创建一个哈希表,因为ASCII码表中只有0~255共256个字符。

char First_Char(char* pString)
{
     if (!pString)    //输入不合法
        return 0;
    int hashTable[tableSize];
    for (int i = 0; i < tableSize; i++)
         hashTable[i] = 0;
    //确定字符串中每个字符出现的次数
    char* pHashKey = pString;
    while (*(pHashKey) != '\0')
        hashTable[*(pHashKey++)]++;
    //找到字符串中只出现一次的那个字符
    pHashKey = pString;
    while (*pHashKey != '\0')
    {
        if (hashTable[*pHashKey] == 1)
            return*pHashKey;
         pHashKey++;
    }
     //如果这个字符串为空,或者字符串中的每个字符都至少出现两次
     return 0;
    }

int main(void)
{
    char str[1000];  //这个函数是在字符串特别大时建议使用,故定义一个大小为1000的数组
    printf("请输入字符串:");
    gets(str);
    if (First_Char(str) == 0)
        printf("输入字符串中没有找到第一个只出现一次的字符!\n");
    else
        printf("输入字符串中第一个只出现一次的字符为:%c\n", First_Char(str));
    system("pause");
    return 0;
}