我一直在关注这个论坛,但今天正式注册。 我现在是一个学习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的功能。我做错了什么?
答案 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
数组26
,0
个元素全部初始化为{{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)
您可以在代码中添加以下行以将值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;
}
一些评论:
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';
}