統計字符串中數字出現頻率

給定一個包含字母和數字的字符串,要求統計出這個字符串中從09的數字的個數。字符串僅包含英文字母與阿拉伯數字,長度1<=len(nums)<=1000
實例輸入:
a11472o5t6
輸出:
0 2 1 0 1 1 1 1 0 0
這裏數字1出現了兩次,記爲2,而2 4 5 6 7各出現一次,記爲1,剩下的0 3 8 9都沒有出現,記爲0。
在C語言中,對於char類型的變量c表示的數字字符,可以通過進行運算c-'0'來得到其所對應的數字值,這是因爲C中字符型的數值運算事實上被隱式轉換爲了int型。

int main() {
    int* nums = (int*) malloc(10 * sizeof(int));
    char c;
    
    for(int i = 0; i < 10; i++)
        *(nums+i) = 0;

    while(scanf("%c", &c) == 1)
        if(c >= '0' && c <= '9')
            (*(nums+(c-'0')))++;
    
    for(int i = 0; i < 10; i++)
        printf("%d ", *(nums+i));
        
    free(nums);
    
    return 0;
}

通過malloc獲得一個十位的全0列表,同時通過scanf來逐一獲取字符串中的字符,並通過ascii碼值比較判斷是否爲數字,,同時將對應位的數字加一。最後則是一個輸出過程。當然,由於使用了malloc,所以不能忘記使用free釋放這些內存空間。
另外值得一提的是由於free函數僅銷燬已經不再需要的內存空間而不對指針做變化,我們剩下的指針將仍然存在直到程序結束,但卻指向了垃圾內存,爲了避免調用這些指針發生不必要的錯誤,在實際編程中我們可能需要主動將該指針指向NULL
其實這個有個malloc部分我們完全可以用數組代替。甚至有人使用數組直接一次性讀入字符串的方法。

char str[1001];
scanf("%s", str);
int lut[10] = {0, };
for (int i = 0; i < strlen(str); ++i) {
    if (str[i] >= '0' && str[i] <= '9') {
        ++lut[str[i] - '0'];
    }
}
for (int i = 0; i < 10; ++i) {
    printf("%d ", lut[i]);
}

題目說明了字符串最長有1000位,這裏使用str[1001],別忘了字符串最後需要一位存放\0來表示字符串結尾。這段代碼相比前者可讀性提高了一點。

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