题目描述:
实现一个函数用来找出字符流中第一个只出现一次的字符。
分析:
使用ASCII字符集只有256个字符,可以定义一个长度为256的数组,使得数组下标对应的的记录字符出现的位置,初始时数组的每个元素都初始化为-1. 每遇到一个字符,先判断在数组中的对应位置上的值是否为-1,若是,则表示当前遇到的字符是第一次出现,就将对应位置改为1;若数组的对应位置不是-1,则表示当前遇到的字符已经出现过了,则把数组当前位置的值变为-2. 持续次过程直到读完所有字符,然后遍历数组,找到数组中存在的不是-2的最小数,并该元素对应的下标转换成字符就可得到第一个只出现一次的字符.
class func{
private:
int arr[256];
int index;
public:
func(): index(0) {
for(int i = 0; i < 256; i++)
arr[i] = -1;
}
void InsertChar(char ch){
if(arr[(int)ch] == -1){
arr[(int)ch] = index;
}else{
arr[(int)ch] = -2;
}
Index++;
}
char FirstAppearingOnce(){
char ch = '#';
int MIN = (int)((unsigned)~0 >> 1);
for(int i = 0; i < 256; i++){
if(arr[i] >= 0 && arr[i] < MIN){
ch = (int) i;
MIN = arr[i];
}
}
return ch;
}
};