理解删除字符串中重复字符的代码(来自破解编码面试)[关闭]

Posted

技术标签:

【中文标题】理解删除字符串中重复字符的代码(来自破解编码面试)[关闭]【英文标题】:understanding code that removes duplicate characters in a string (from cracking the coding interview) [closed] 【发布时间】:2012-07-21 22:10:33 【问题描述】:

这是来自“破解编码面试”Q1.3 的问题“设计一种算法并编写代码以在不使用任何额外缓冲区的情况下删除字符串中的重复字符。注意:一个或两个额外的变量很好。一个额外的数组的副本不是。”我编写了一个似乎运行良好的程序,但我对自己的程序感到困惑。这是附上的代码。

string remove_duplicates(string &s1)

   int n=s1.size();
   for(int i=n-1; i!=-1; --i)
        for(int j=0; j<i; ++j)
        
            if(s1[i]==s1[j])
            
                int k=i;
                while(k!=n)
                
                    s1[k]=s1[k+1];
                    k++;
                
            
        
    return s1;

如果 s1=abcdeafg,使用此代码输出将是 abcdefg,(如果输入是 abababab,输出将是 ab) 但我的想法是,因为 s1 的长度没有改变,所以输出应该是 abcdefga,因为我只是将第二个 'a' 移动到 s1 的末尾。大家能帮我解释一下吗?

【问题讨论】:

【参考方案1】:

s1 的长度实际上是在变化的。当您找到重复字符并使用 while(k!=n) 循环将重复字符移向 s1 的末尾时,在循环的最终迭代中,当 k == n-1 时,代码正在评估 s1[ n-1] = s1[n] 实际上是 s1[n-1] = '\0',所以 s1 的长度缩短了 1。

【讨论】:

你是说size()的值变了吗? @KerrekSB:不,实际上 s1 的 size() 从一开始就没有改变。但是当你输出一个 C++ 字符串时,它会停止,直到它到达一个 NULL 字符,换句话说,如果你将一个字符串指定为“abcde”,然后将该字符串的第 4 个字符指定为 '\0',如果你尝试使用cout输出这个字符串你会发现输出的是“abcd”而不是“abcde”。 @derekhh:我不确定我会买那个。您是否声称std::cout &lt;&lt; std::string("QR\0S", 4) 只能打印“QR”? (在这种情况下,我的编译器坏了。) @KerrekSB:恩,我还发现我的评论不正确...只是因为 '\0' 字符不会被输出... 在我的编译器上(我确信按照标准的要求),everything 正如你所说的那样“输出”。不过,您的 终端 可能没有打印可见字符。尝试将结果通过hexdump 传送到文件中,以确定。

以上是关于理解删除字符串中重复字符的代码(来自破解编码面试)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中删除重复字符

openrefine优缺点

算法面试题

从字符串中删除特定 unicode 范围的字符

破解大厂面试动态算法题:字符串分解单词和二叉树统计

删除先前已连接其他变量的字符串中的重复单词