在字符串中找出第一個只出現一次的字符。經典C語言例題

原題要求:

在字符串中找出第一個只出現一次的字符。

如輸入“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;
}

本文只實現了簡單的功能,所以還有很多缺點,也有很多沒發現的問題,歡迎各位大神批評指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章