原題請參考:http://www.oschina.net/code/snippet_270597_35306 算法
#include <stdio.h> /*---------------------------------------------------------------------------------------- * 題目一:經過鍵盤輸入一串小寫字母(a~z)組成的字符串。 * 請編寫一個字符串過濾程序,若字符串中出現多個相同的字符,將非首次出現的字符過濾掉。 * 好比字符串「abacacde」過濾結果爲「abcde」。 * * 要求實現函數:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr); * *【輸入】 pInputStr: 輸入字符串 * lInputLen: 輸入字符串長度 *【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長; * *【注意】只須要完成該函數功能算法,中間不須要有任何IO的輸入輸出 * * 示例 * 輸入:「deefd」 輸出:「def」 * 輸入:「afafafaf」 輸出:「af」 * 輸入:「pppppppp」 輸出:「p」 -------------------------------------------------------------------------------------------*/ void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr) { unsigned int nInput = 0; long nIndexOutputStr = 0; for (long nIndexInputStr = 0; nIndexInputStr < lInputLen; nIndexInputStr++) { int nMoveNum = pInputStr[nIndexInputStr] - 'a'; unsigned int nPlace = 1 << nMoveNum; if ((nInput&nPlace) == 0) { nInput = nInput | nPlace; pOutputStr[nIndexOutputStr++] = pInputStr[nIndexInputStr]; } } pOutputStr[nIndexOutputStr] = '\0'; } /*-------------------------------------------------------------------------------------------- * 題二:題目描述(40分): * 經過鍵盤輸入一串小寫字母(a~z)組成的字符串。請編寫一個字符串壓縮程序,將字符串中連續出席的重複字母 * 進行壓縮,並輸出壓縮後的字符串。 * 壓縮規則: * 1. 僅壓縮連續重複出現的字符。好比字符串"abcbc"因爲無連續重複字符,壓縮後的字符串仍是"abcbc". * 2. 壓縮字段的格式爲"字符重複的次數+字符"。例如:字符串"xxxyyyyyyz"壓縮後就成爲"3x6yz" * * 要求實現函數: * void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr); * *【輸入】 pInputStr: 輸入字符串 * lInputLen: 輸入字符串長度 *【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長; * *【注意】只須要完成該函數功能算法,中間不須要有任何IO的輸入輸出 * * 示例 * 輸入:「cccddecc」 輸出:「3c2de2c」 * 輸入:「adef」 輸出:「adef」 * 輸入:「pppppppp」 輸出:「8p」 --------------------------------------------------------------------------------------------*/ void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) { char cLetter = ' '; long nLetterNum = 0; long nIndexOutputStr = 0; for (long nIndexInputStr = 0; nIndexInputStr < lInputLen; nIndexInputStr++) { if (cLetter == pInputStr[nIndexInputStr]) { nLetterNum++; } else { if (nLetterNum > 1) { nIndexOutputStr += sprintf_s(pOutputStr + nIndexOutputStr, lInputLen - nIndexOutputStr, "%d%c", nLetterNum, cLetter); nLetterNum = 0; } else if(nLetterNum == 1) { pOutputStr[nIndexOutputStr++] = cLetter; nLetterNum = 0; } cLetter = pInputStr[nIndexInputStr]; nLetterNum = 1; } } if (nLetterNum > 1) { nIndexOutputStr += sprintf_s(pOutputStr + nIndexOutputStr, lInputLen - nIndexOutputStr, "%d%c", nLetterNum, cLetter); nLetterNum = 0; } else if (nLetterNum == 1) { pOutputStr[nIndexOutputStr++] = cLetter; nLetterNum = 0; } pOutputStr[nIndexOutputStr] = '\0'; } int main() { char cStr[20]; stringFilter("deefd", 5, cStr); printf("%s\n", cStr); stringFilter("afafafaf", 8, cStr); printf("%s\n", cStr); stringFilter("pppppppp", 8, cStr); printf("%s\n", cStr); stringZip("cccddecc", 8, cStr); printf("%s\n", cStr); stringZip("adef", 4, cStr); printf("%s\n", cStr); stringZip("pppppppppppp", 12, cStr); printf("%s\n", cStr); getchar(); return 0; }