以下是问题: 编写一个只迭代字符串一次并使用O(1)额外内存的解决方案,因为这是您在真实访谈期间要求做的事情。
给定一个字符串s,找到并返回其中非重复字符的第一个实例。如果没有此类字符,请返回' _'。
这是我的代码:
char firstNotRepeatingCharacter(char * s) {
int count;
for (int i=0;i<strlen(s);i++){
count=0;
char temp=s[i];
s[i]="_";
char *find= strchr(s,temp);
s[i]=temp;
if (find!=NULL) count++;
else return s[i];
}
if (count!=0) return '_';
}
我不知道什么是错的但是在给出输入时: s:&#34; abcdefghijklmnopqrstuvwxyziflskecznslkjfabe&#34; 输出是我的代码是&#34; g&#34;而不是&#34; d&#34;。 我认为代码应该已经转义循环并返回&#34; d&#34;很快&#34; d&#34;被找到。 Thx提前!!!
答案 0 :(得分:1)
在你的程序中,问题出在本声明中 -
s[i]="_";
您正在为字符类型变量s[i]
指定字符串。将其更改为 -
s[i]='_';
在firstNotRepeatingCharacter()
函数的底部,return
语句处于if
条件下,编译器必须对此发出警告,因为该函数应返回char
1}}。而且,不需要count
变量。你可以这样做:
char firstNotRepeatingCharacter(char * s) {
for (int i=0;i<strlen(s);i++){
char temp=s[i];
s[i]='_';
char *find= strchr(s,temp);
s[i]=temp;
if (find==NULL)
return s[i];
}
return '_';
}
但是这个代码在循环中使用strchr
迭代字符串所以,这不是你问题的确切解决方案,因为你有条件 - 程序应该迭代字符串一次仅即可。您需要重新考虑问题的解决方案。
您可以使用递归来实现您的目标,例如 - 使用递归迭代字符串,并以某种方式识别重复字符,而堆栈清理时识别字符串中非重复字符的第一个实例。这是实施 -
#include <stdio.h>
int ascii_arr[256] = {0};
char firstNotRepeatingCharacter(char * s) {
char result = '-';
if (*s == '\0')
return result;
ascii_arr[*s] += 1;
result = firstNotRepeatingCharacter(s+1);
if (ascii_arr[*s] == 1)
result = *s;
return result;
}
int main()
{
char a[] = "abcdefghijklmnopqrstuvwxyziflskecznslkjfabe";
printf ("First non repeating character: %c\n", firstNotRepeatingCharacter(a));
return 0;
}
在上面的代码中,firstNotRepeatingCharacter()
函数仅使用递归迭代字符串一次,并且在堆栈清除期间,它识别第一个非重复字符。我使用长度为256的全局int
数组ascii_arr
来跟踪非重复字符。