帮我将这个Java函数转换为C++

Eug*_*ene 2 c++ java

我一直在关注这个论坛,但今天正式注册.我现在是一个学习C++的Java人.

作为练习,我开始用C++重写我编写的一些Java代码(当时我正在学习它).

这里有几个问题给了我很多帮助.但我现在卡住了,需要一些帮助.

我试图解决的问题是计算数组中的最大重复字符数.想法是将大小为26的数组保持为频率数组,arr [0]用于'a',arr [1]用于'b',依此类推.为输入数组中的每个char增加合适的位置,最后找到具有最大计数的索引.

这是我的Java函数:

static char findMax(String str) {
    int arr[] = new int[26];
    int i;

    for(i=0;i<str.length();i++)
        arr[str.charAt(i) - 'a']++;

    int maxFreq = arr[0];
    int maxEleIndex = 0;
    for(i=1;i<26;i++)
        if(arr[i] > maxFreq) {
            maxFreq = arr[i];
            maxEleIndex = i;
        }

    return (char)(maxEleIndex + 'a');
}
Run Code Online (Sandbox Code Playgroud)

这是我的C++函数:

char findMax(string str) {
int *arr = new int[26];
int i;
for(i=0;i<str.length();i++)
    arr[str.at(i) - 'a']++;

int maxFreq = arr[0];
int maxEleIndex = 0;
for(i=1;i<26;i++)
    if(arr[i] > maxFreq) {
        maxFreq = arr[i];
        maxEleIndex = i;
    }   

return (char)(maxEleIndex + 'a');
Run Code Online (Sandbox Code Playgroud)

}

代码编译很好,但没有给出正确的输出,它报告错误的char作为最大重复.我用指针代替参考,代替charAt的功能.我究竟做错了什么?

cod*_*ict 7

您没有arr在C++代码中将频率数组初始化为全零.
您可以通过以下两种方式之一解决此问题:

修复1:

在Java数组元素中,根据其类型初始化为默认值.对于int默认值if 0.在C++版本中,动态分配的数组元素将具有垃圾值.由于您希望将它们初始化为0您应该:

int *arr = new int[26]();
                      ^^
Run Code Online (Sandbox Code Playgroud)

另请注意,在C++中,与Java不同,需要释放分配的任何动态分配的内存.您可以通过使用delete运算符来执行此操作:

delete [] arr;
Run Code Online (Sandbox Code Playgroud)

在你的功能结束时findMax.

修复2:

由于您26在编译时知道要分配的数组的大小(),因此无需进行动态分配.你可以这样做:

int arr[26] = {};
Run Code Online (Sandbox Code Playgroud)

这声明了一个int数组arr,其26元素全部初始化为0.