字串的使用和注意點及西大OJ20解答
阿新 • • 發佈:2019-02-18
題目:(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; }