与部分阵列斗争

时间:2015-06-30 09:41:05

标签: c++ arrays string loops

以下是问题:

编写一个名为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];
            }
        }

    }
}

所以我只是试图让函数删除正确设置的重复字母。我的方法似乎不起作用。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

我相信,在您的deleteRepeats()代码中,通过使用letters[i+1]letters[i+2]之类的索引,您可以超越界限。这反过来调用undefined behaviour

您需要将逻辑更正为

  1. 将索引限制为有效值。
  2. 查找所有重复条目的出现次数。不只是相邻的。

答案 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)

  1. string_of_letters应该是list或vector(list更好,因为vector将段删除后的所有元素重新定位到新位置。)
  2. 你写过“删除数组中所有重复的字母”,但在你的实际实现中,你只检查数组中相邻的字符是否相同。

答案 3 :(得分:0)

您的代码仅适用于彼此相邻的重复字母的数组,但您的示例数组有一个&#39; b&#39;在两个人之间。

您可以通过使用哈希映射来存储作为键遇到的字母然后删除哈希映射中已存在的数组中的任何字符来修复它。