理解删除字符串中重复字符的代码(来自破解编码面试)
understanding code that removes duplicate characters in a string (from cracking the coding interview)
这是"破解编码面试"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的末尾。你们能帮我解释一下吗?
s1的长度实际上在变化。当您找到一个重复的字符并使用while(k!=n)循环将重复的字符移向s1的末尾时,在循环的最后一次迭代中,当k==n-1时,代码计算的是s1[n-1]=s1[n],实际上是s1[n-11]='\0',因此s1的长度缩短了1。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 绝对编码器十六进制输入
- 防止C++中的硬编码数字
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用文件内容作为硬编码字符串
- 运行长度编码程序 c++ 的问题
- 暴力破解技术解决以下问题
- 以C++为单位进行运行长度编码
- *新的编码器*格式和运算符
- 破解编码面试,11.5,搜索
- 理解删除字符串中重复字符的代码(来自破解编码面试)
- 破解编码面试的LIS解决方案中的分割故障11.7