这道题,并不难,在笔试上碰到,我的思路是,两个下标,一前一后,前下标小于等于字符串长度,后下标去遍历字符串,看看是否相等。
到面试的时候,面试官叫我解释我写的算法,并给出了一个例子,然后我自己走了一遍,发现出错了,而错误的原因就是,是没有对重复出现的字符做标记,然后first下标依旧会遍历到重复字符,所以找不到出现过一次的字符。
因为面试有点紧张,当时给出的改法是增添一个列表什么的去记录,说不太清楚,面试官就说了直接用双重循环吧,面试完发现自己许多不足,C++很多知识忘了,正则表达式的基本用法都忘了差不多,多线程、操作系统没继续学下去了解不多。
面试完后,想出了一个方法,申请一个数组,大小和字符串数组长度一样,全部初始化为0,如果出现重复,就把重复的下标的值改为1.,相当于索引.
代码:
char find_one(char *a) {
if (strlen(a) == 1) {
return a[0];
}
int first = 0, next = 1;
int len = strlen(a) - 1;
int *flag = new int[len + 1];
for (int i = 0; i < len + 1; i++)
flag[i] = 0;
while (first <= len) {
if (flag[first] != 0 ) {
first++;
next = first + 1;
continue;
}
else if (a[first] == a[next]) {
flag[first] = 1;
flag[next] = 1;
first++;
next = first + 1;
}
if (next == len + 1) {
return a[first];
}
next++;
}
delete[] flag;
return ' ';
}