昨天参加了一次笔试,最后一道题是这样的:找出一个纯字母字符串中第一个只出现一次的字符。
我的思路是这样的,假设该字符串是由纯小写字母组成,则可以定义一个布尔数组,该数组保存每个字符出现次数是否大于 1 的状态。接着遍历字符串,同时利用 ASCII 码对应到布尔数组,判断状态即可。鄙人的 C++ 代码如下:
#include#include using namespace std;char FirstAppearOnce(char* str) { bool moreThanOnce[26] = {false}; for (char* p = str; *p != '\0'; ++p) { assert((*p >= 'a') && (*p <= 'z')); char* q; for (q = p + 1; !moreThanOnce[*p - 'a'] && (*q != '\0'); ++q) { if (*q == *p) { moreThanOnce[*p - 'a'] = true; break; } } if (*q == '\0') { return *p; } } return 0;}int main() { char* str = "thisisateststring"; cout << FirstAppearOnce(str) << endl; system("pause"); return 0;}
如果存在大小 写、符号等情况,则可以为 整个 ASCII 字符创建一个布尔数组(ASCII 有 128 个字符,因此数组可改为 128 个元素 ) 。对上面代码稍稍修改一下,便可以支持所有字符:
#includeusing namespace std;char FirstAppearOnce(char* str) { bool moreThanOnce[128] = {false}; for (char* p = str; *p != '\0'; ++p) { char* q; for (q = p + 1; !moreThanOnce[*p] && (*q != '\0'); ++q) { if (*q == *p) { moreThanOnce[*p] = true; break; } } if (*q == '\0') { return *p; } } return 0;}int main() { char* str = "This is a test string."; cout << FirstAppearOnce(str) << endl; system("pause"); return 0;}
欢迎拍砖。