我在下面编写了这个代码,用于获取字符串(并将其放入数组)和数字的小程序,然后搜索数组以查找是否有重复字符(并计算重复次数) , 如果是这样;程序将比较特定字符重复的次数以及重复次数是否等于用户给出的次数;该计划将取代他们的角色' A'。例如;如果我们给予该计划" BBCC"它应该给我们结果" AAAA"。问题是我的代码适用于某些示例,并且不适用于上面的示例。这是代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char str[30];
int i, j, k, l, number, counter = 0;
char ch;
cout << "Enter a string: ";
gets (str);
cout << "\nEnter a number: ";
cin >> number;
for (i =0; str[i]; i++){
ch = str[i];
for (j = 0; str[j]; j++){
if (str[j] == ch){
counter++;
}
}
if (counter == number){
for (k = 0; str[k]; k++){
if (str[k] == ch){
str[k] = 'A';
}
}
}
}
for (l = 0; str[l]; l++){
cout << str[l];
}
getchar ();
return 0;
}
另一个错误是,如果我们给它字符串&#34; ABC&#34;和数字2;结果将是&#34; AAC&#34;! 我知道我的代码有点乱,因为我是初学者,所以请道歉并帮助我解决我的问题。 感谢。
答案 0 :(得分:1)
您需要在循环中重置counter
变量。
对于ABC
示例:
A
s。有1 A,所以counter = 1
。 B
秒。有1 B,所以计数器增加到counter = 2
! B
替换为A
=&gt; AAC
答案 1 :(得分:0)
for (i = 0 ; str[ i ] ; i ++ )
{
if( str[ i ] != 'A' ) // because replacing A with A is pointless
{
counter = 0 ;
ch = str[ i ] ;
for ( j = 0 ; str[ j ] ; j ++ )
{
if ( str[ j ] == ch )
{
counter ++ ;
}
}
if (counter == number)
{
for ( j = 0 ; str[ j ] ; j ++ )
{
if ( str[ j ] == ch )
{
str[ j ] = 'A' ;
}
}
}
}
}
我试图将所有评论都放在纠正+一些优化上,请告诉我是否还有错误
编辑:
C ++ 11对于他的简化而言非常漂亮; - )
map< char , vector< int > > counters ;
for (i = 0 ; str[ i ] ; i ++ )
{
counters[ str[ i ] ].push_back( i ) ;
}
for( pair< char , vector< int > > liste : counters )
{
vector< int > vec = liste.second ;
if( vec.size( ) == number )
for( int elt : vec )
str[ elt ] = 'A' ;
}
解释:我浏览数组,将每个索引存入与char关联的索引列表(地图用于)
最后,我只看一下每个字符的向量大小,如果大小等于number
,我会通过这个列表来放置每个元素&#34;指向&#34;按索引到&#39; <&#39;