1. 程式人生 > >字串的使用和注意點及西大OJ20解答

字串的使用和注意點及西大OJ20解答

題目:(http://oj.gxu.edu.cn/problem/20/)

一個字串中可能包含a~z中多個字串,並且可能會有重複,如 String data ="abcdaaa",這道字串出現次數最多的字母就是a,出現了4次。現在使用者輸入一個字串,我們需要求出出現次數最多的字母,並且求出次數,如果存在字母中出現最多的次數不唯一,但所有出現次數最多的字母及次數都要打印出來。

解決思路:

1、要定義一個字元陣列用於存字串,輸入的時候,用gets()來輸入

2、然後定義一個int陣列,長度26,每一個表示a~z出現的次數。

3、對字元陣列進行判斷,只要沒到陣列結束標識(\0),就判斷,同時count[26]和字元的關係。當檢測是a的時候,對應的count[0]就自加1,因為a的ASCII碼是97,所以就是

count[(int)str[i]-97]++

str[i]就是對應的這個字元,變成int型(轉成ASCII)然後減去97,就是count對應的位置。

4、然後利用另一個數組int num[]和count[]弄成一樣,這樣子再對num[]陣列進行排序(降序,從小到大),就可以知道出現最多次的次數maxNum

(PS:這個降序的使用qsort()和cmp())

5、最後對count[]進行迴圈判斷,如果有一樣是maxNum就是出現最多次對應的a~z的位置,所以輸出就是%c, i+97,就是又把int變為char輸出(int的ASCII對應的char輸出)

最後實現的程式:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>   //快速排序的標頭檔案 
#define MAX 1000000

int cmp(const void *a , const void *b)   //這個是從大到小排序 
{   
    return *(int *)b - *(int *)a;   
} 

int main()
{
	char str[MAX];
	while(gets(str)!=NULL)
	{
		int count[26] = {0};
		int num[26] = {0};
		int len,maxNum;
		for(int i = 0;i < MAX;i++)
		{
			//判斷一個字串是否結束的標誌就是看是否遇到‘\0’,如果遇到‘\0’,則表示字串結束。 
			if(str[i] == '\0')  //遇到換行符就結束  
				break;
			
			count[(int)str[i]-97]++;
			num[(int)str[i]-97]++;	
		}
		qsort(num,26,sizeof(num[0]),cmp);  //排序找出出現最多的次數 
		maxNum = num[0];
		
		for(int i = 0;i < 26;i++)
		{
			if(count[i] == maxNum)
			{
				printf("%c %d\n",i+97,maxNum);  //i+97就是對應的英文 
			}
		}
		
	} 
	
	return 0;
}