我一直在关注这个论坛,但今天正式注册.我现在是一个学习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的功能.我究竟做错了什么?
您没有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.
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |