首先不重复字符代码

时间:2017-10-27 11:32:40

标签: c arrays string

以下是问题: 编写一个只迭代字符串一次并使用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提前!!!

1 个答案:

答案 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来跟踪非重复字符。