我正在尝试编写一个代码来替换字符串中的重复项' *' 。我写的代码是 -
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
string ch;
cin>>ch;
for(int i=0;i<ch.length()&& (ch[i]!='*');i++)
{
for(int j=i+1;j<ch.length()&&ch[j]!='*';j++)
{
if(ch[i]==ch[j])ch[j]='*';
}
}
cout<<ch;
}
上面的代码为某些输入提供了意外的结果。 对于例如如果输入是&#34; adad&#34;我得到的答案是&#34; ad * d&#34;,而&#34; adda&#34;和&#34; aadd&#34;的输出。匹配预期的输出。谁能告诉我我做错了什么?
答案 0 :(得分:2)
就像Piotr S.在评论中所说,你需要继续处理字符串,即使当前字符是*
。这是我的看法,这应该有效:
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
string ch;
cin >> ch;
for(int i = 0; i < ch.length(); ++i)
{
if(ch[i] == '*') continue; // skip this entry
for(int j = i + 1; j < ch.length(); ++j)
{
if(ch[i] == ch[j]) ch[j]='*';
}
}
cout<<ch;
}
答案 1 :(得分:0)
提示: 一旦循环条件返回false,您的for循环就会中断。在外部for循环的第一次迭代之后,adad更改为ad * d。但是,i
设置为1
,j
设置为2
。你的第二个for循环会用这些值执行吗?
答案 2 :(得分:0)
您的代码存在问题:
如果遇到*
,您将停止外循环。现在,假设输入为abcabc
。在外循环的第一次迭代中,您将其更改为abc*bc
。在外循环内部循环的第二次迭代中将遇到*
并将退出(不将b
更改为*
)。外循环的第三次迭代也会发生同样的事情。在外循环的第四次迭代中,退出条件(ch[i] != '*'
)将变为false,程序将退出。这是一个修复:
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
string ch;
cin >> ch;
for(int i=0; i < ch.length(); i++)
{
for(int j = i + 1; j < ch.length(); j++)
{
if(ch[i] == ch[j] && ch[i] != '*')
ch[j]='*';
}
}
cout << ch << endl;
}