以下是问题:
编写一个名为deleteRepeats()
的函数,该函数具有部分填充的字符数组作为形式参数,并删除数组中所有重复的字母。由于部分填充的数组需要两个参数,因此该函数实际上将具有两个形式参数:数组参数和类型int
的形式参数,其给出了所使用的数组位置的数量。删除字母后,剩余的字母将向前移动以填补空白。这将在数组的末尾创建空位置,以便使用较少的数组。由于形式参数是部分填充的数组,因此int类型的第二个形式参数将告知填充了多少个数组位置。第二个形式参数将是一个call-by-reference参数,并将被更改以显示删除重复字母后使用了多少数组。例如,请考虑以下代码:
char a[10]; a[0] = 'a'; a[1] = 'b'; a[2] = 'a'; a[3] = 'c'; int size = 4;
deleteRepeats(a, size);
执行此代码后,a [0]的值为' a,#[1]的值为' b',a的值为[2]是' c',并且size的值是3.(a [3]的值不再是任何问题,因为部分填充的数组不再使用此索引变量。)您可以假设部分填充的数组仅包含小写字母。将您的功能嵌入合适的测试程序中。
这是我到目前为止所得到的。我刚刚尝试使用deleteRepeats()
函数:
#include <iostream>
using namespace std;
const int max_letters = 4;
void deleteRepeats(char letters[], int size, int& numberOfLetters);
int main()
{
char string_of_letters[max_letters] = {'a','b','a','c'};
int letter_count = 4;
deleteRepeats(string_of_letters, max_letters, letter_count);
for (int i=0; i<letter_count; i++)
{
cout<<string_of_letters[i];
}
return 0;
}
void deleteRepeats(char letters[], int size, int& numberOfLetters)
{
for (int i=0; i<numberOfLetters; i++)
{
if (letters[i] == letters[i+1])
{
for (int i=0; i<numberOfLetters; i++)
{
letters[i+1] = letters[i+2];
}
}
}
}
所以我只是试图让函数删除正确设置的重复字母。我的方法似乎不起作用。我该如何解决这个问题?
答案 0 :(得分:1)
我相信,在您的deleteRepeats()
代码中,通过使用letters[i+1]
,letters[i+2]
之类的索引,您可以超越界限。这反过来调用undefined behaviour。
您需要将逻辑更正为
答案 1 :(得分:0)
您只使用letters[i] == letters[i+1]
检查两个连续的邻居。显然,该问题希望您删除所有后续匹配项,以便abac
变为abc
。将您的算法更改为以下内容:
void deleteRepeats(char letters[], int size, int& numberOfLetters)
{
int k = 0;
for(int i = 0; i < numberOfLetters; ++i)
{
bool found = false;
for(int j = 0; j < k; ++j)
if(letters[i] == letters[j])
found = true;
if(!found)
letters[k++] = letters[i];
}
numterOfLetters = k;
}
您也可以考虑开始熟悉STL。
答案 2 :(得分:0)
答案 3 :(得分:0)
您的代码仅适用于彼此相邻的重复字母的数组,但您的示例数组有一个&#39; b&#39;在两个人之间。
您可以通过使用哈希映射来存储作为键遇到的字母然后删除哈希映射中已存在的数组中的任何字符来修复它。