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

时间:2010-10-11 06:14:48

标签: java c++

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

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

这里有几个问题帮了我很多忙。但我现在被困住了,需要一些帮助。

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

这是我的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');
}

这是我的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');

}

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

6 个答案:

答案 0 :(得分:7)

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

修复1:

在Java数组元素中,根据其类型初始化为默认值。对于int 0,默认值为0。在C ++版本中,动态分配的数组元素将具有垃圾值。由于您希望将它们初始化为int *arr = new int[26](); ^^ ,您应该执行以下操作:

delete

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

findMax

功能结束时26

修复2:

由于您在编译时知道要分配的数组的大小(int arr[26] = {}; ),因此无需进行动态分配。你可以这样做:

int

这声明arr数组260个元素全部初始化为{{1}}。

答案 1 :(得分:2)

codaddict是对的,您应该将arr初始化为全零,然后您的代码才能正常工作。无论如何这里是一个重写,使它看起来更多C ++方式

#include <algorithm>
char findMax(const string &str) {  // not necessary to copy the string arg
int arr[26] = { 0 };   // arrays with size known at compile time
                       // can be allocated on stack
for(string::size_type i=0;i<str.length();i++)
    arr[str.at(i) - 'a']++;
return static_cast< char >( std::max_element( arr, arr + 26 ) - arr + 'a' );
}

答案 2 :(得分:1)

如果你想与C比较:

#include <stdio.h>

char findMax (char *str){
    int max, i, maxIndex;

    int arr[26] = {};

    for (i=0; str[i]; i++) arr[str[i] - 'a']++;

    max = arr[0];
    maxIndex = 0;
    for (i=1; i<26; i++){
        if (arr[i]>max){
            max = arr[i];
            maxIndex = i;
        }
    }

    return (char)('a' + maxIndex);
}

int main (){
    char str[51] = "ajsheuaptoemandjeitmaneitmaneowpqlakemtnatengjfnau";

    printf ("char: %c\n", findMax (str));

    return 0;
}

答案 3 :(得分:1)

Eugene

您可以在代码中添加以下行以将值ZERO分配给arr。 或者更好地避免使用动态分配,因为它不是你需要的,并且需要手动完成释放(它不像java)

填补内存块:

memset(arr,0,26 * sizeof(int)); //在为arr分配内存后的findMax中

取消分配:

delete [] arr; //返回之前的findMax函数

答案 4 :(得分:1)

#include <algorithm>
#include <iostream>
#include <climits>
#include <string>

using std::string;

char findMax(const string &str) {
  string::size_type freq[UCHAR_MAX + 1] = { 0 };

  for (string::const_iterator it = str.begin(); it != str.end(); ++it)
    freq[(unsigned char) *it]++;
  return static_cast<char>(std::max_element(freq, freq + UCHAR_MAX + 1) - freq);
}

int main() {
  char letter = findMax("Hello, world. How are you?");
  std::cout << letter << "\n";
  return 0;
}

一些评论:

  • 在C ++中,倾向于使用迭代器而不是显式数组索引。
  • 无论字符串中出现哪个字符字节,此代码都有效。所以要注意Unicode字符。
  • 由于char可能是有符号或无符号的,因此我必须将数组索引转换为保证为非负的内容。

答案 5 :(得分:1)

char findMax(const string& str) 
{
    const int alphabet_size = 26;

    int arr[alphabet_size] = {};

    for_each(str.begin(), str.end(), [&](char c) { ++arr[c - 'a']; });

    return max = max_element(arr, arr+alphabet_size) - arr + 'a';
}