0

给定一个字符串,例如“121”,我试图计算 1 和 2 的数量,然后返回字符串“2112”(因为有 2 个 1 和 1 个 2)。我不确定问题出在我的代码中,但我得到了荒谬的结果,如果有人能指出哪里出了问题,那就太好了。到目前为止,这是我的代码:

现在可以用了,非常感谢。

string operate(string s) 
{  
    string input = "121; 
    int count[10] = {0}; 
    string answer; 

    for(int n = 0; n < input.length(); n++) 
    {              
        int a = (input[n]-'0');        
        count[a]++;
    }      

    for(int n = 1; n < 10; n++) 
    { 
        if(count[n] > 0)   
        {  
            stringstream ss;
            ss << count[n] << n;
            answer.append(ss.str());  
        }          
    }         
    return answer;
}
4

5 回答 5

3

你这里有三个问题。首先,您没有在使用内存之前对其进行初始化。这样做很简单:

int count[10]{}; //all 0

由于您的编译器支持而失败,这样的事情将起作用:

int count[10] = {0};

接下来,您将越界访问您的数组:

int a = input[n];         
count[a]++;

首先,将字符串中该字符的数值分配给a. 如果 ASCII 正在使用并且字符是'1',那将是 49。接下来,您访问a数组的元素。你这里只有 10 个,但你可能已经访问过了。由于数字字符代码是连续的,只需减去0即可以整数形式获得您要查找的数字值:

int a = input[n] - '0';
count[a]++;

以 为例'1',contiguous 表示'1'一个过去'0''1' - '0'1 也是。

最后,稍后您将忽略数组的第一个元素。让你的第二个循环从 0 开始索引,而不是 1。


顺便说一句,我可以建议使用字典(为了好玩而使用一些 C++11)吗?

std::string input = "12113412"; 
std::map<char, int> count; //map characters to counts

for (char c : input) //loop through each character in string
    count[c]++; //this creates the element if it isn't

std::string result;

for (auto p : count) { //each value in map is a pair
   result += std::to_string(p.second) += p.first;
}

std::cout << result;

输出:

41221314

于 2013-04-02T04:13:02.657 回答
2

您的代码存在多个问题。

首先,这个:

int count[10];

..不会初始化值。它们将是随机内存地址。你要这个:

int count[10] = { 0 };

..这使得数组中的所有项目初始化为 0。

此外,您只在数组中声明了 10 个项目,但是:

int a = input[n];

..在“121”示例中的变量a中存储“49”(1 == 49 ASCII)。然后你这样做:

count[49]++; // Wrong.. there is no element 49

您似乎将数组用作某种Dictionary,但事实并非如此。

只需将其更改为:

int a = input[n] - 48;
count[a]++;

..作品。这是完整的输出:

std::string operate(std::string s) 
{   
    int count[10] = { 0 }; 
    string answer; 

    for(int n = 0; n < s.length(); n++) 
    {              
        int a = s[n] - 48;
        count[a]++;
    }      

    for(int n = 0; n < 10; n++) 
    { 
        if(count[n] > 0)   
        {  
            stringstream ss;
            ss << count[n] << n;
            answer.append(ss.str());  
        }          
    }         
    return answer;
}

..这将返回2112输入“121”。

于 2013-04-02T04:15:09.740 回答
1

您分配给“a”的行应如下所示:

int a=todigit(input[n]);   

您当前正在做的是分配 ASCII 值,这将导致缓冲区溢出。

于 2013-04-02T03:59:32.413 回答
0

int a = 输入[n]?

input[n] 是一个char,a会得到对应字符的ascii码。对于您的示例, input[0] 返回 49,这是 char“1”的 ascii 值。使用 atoi 将 char 转换为 int 将完成这项工作。

于 2013-04-02T03:59:06.033 回答
0

你应该初始化计数[10]。

memset(&count, 0, sizeof(count));
于 2013-04-02T04:06:23.830 回答