数组中的重复值

时间:2018-02-15 01:21:20

标签: c++

我正在尝试在main之外编写一个函数,该函数扫描字符串数组中的重复值,而不使用任何c ++库函数和重复值到空字符串""

我用来测试的数组是

string duplicates[7] = { "apple", "bear", "apple", "daddy", "bear", "daddy", "sunny" };  

然而它无法正常工作,因为它没有完全删除所有重复的值。

int Duplicaters(string arr[], int a)
{
int a = updatenewsize;
string str;
for(int i = 0; i < size; i++)
{
    str = arr[i];

    for(int j = i + 1; j <= updatenewsize; j++)
    {
        if(arr[j] == str) 
        {
            for(int k = j; k <= size - 1; k++) ///< size - 1 for "removal"
            {
                arr[k] = arr[k + 1]; 
            }
            updatenewsize--;  ///< update the size after we "removed"
        }
    }
}
return updatenewsize;
}

3 个答案:

答案 0 :(得分:0)

使用空字符串替换重复项后,您将在Sheets("Sheets2").Range("G3:G100").Copy Sheets("Sheets2").Activate Sheets("Sheets2").Range("A1").Offset(0, l - 1).PasteSpecial xlPasteValues` 进一步计算"" == ""个重复项。你应该在cout中看到它。

我不会分配空字符串,而是交换iarray[j]并递减array[n - 1]

答案 1 :(得分:0)

首先要做的事情。你不能删除&#34;数组中的值。根据定义,数组是固定大小的。您可以做的是覆盖重复值并将唯一值移到左侧。你这样做是为了跟踪数组的新大小应该是什么(在内存中它仍然是相同的大小,但出于实际目的,我们不再关心最后的东西)。我希望你不要介意用变量名清理一些。我这样做是为了明确意图。该函数将返回&#34; new&#34;的大小。具有唯一值的数组。

int removeDuplicatedValues(string array[], int size)
{
    int newsize = size;
    string str;
    for(int i = 0; i < size; i++)
    {
        str = array[i];
        // note that we increment until j < newsize here because
        // we are "shrinking" the array on every match!
        for(int j = i + 1; j < newsize; j++)
        {
            if(array[j] == str) ///< we found a match
            {
                for(int k = j; k < size - 1; k++) ///< size - 1 for "removal"
                {
                    array[k] = array[k + 1];  ///< shift everybody else down
                }
                newsize--;  ///< update the size after we "removed"
            }
        }
    }
    return newsize;
}

你会像这样使用它。数组现在应该只打印出唯一的字符串,我们几乎缩小了数组的大小,只是我们关心的元素。

int main()
{
    string duplicates[7] = { "apple", "bear", "apple", "daddy", "bear", "daddy", "sunny" };
    int length = removeDuplicatedValues(duplicates, 7);
    for (int i = 0; i < length; i++)
    {
        std::cout << duplicates[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}

此快速测试的输出类似于

apple bear daddy sunny

如果你想知道有多少重复你被删除&#34;在这一点上,你可以通过简单的数学运算来完成。由于您知道固定大小(在本例中为7)并且从我们的函数返回的length变量具有唯一元素的数量。

int duplicates = 7 - length; ///< how many duplicates did we have?

答案 2 :(得分:0)

您可以使用此代码。

#include <iostream>
#include <string.h>
using namespace std;
string* arrayNew;
int arrayNewSize=0;
string *removeDuplicatedValues(string *array, int arraySize)
{
    int duplicatecounter = 0;
    string empty = "";
        for (int i = 0; i < arraySize; i++)
        {
            string s = array[i];
            for (int j = i + 1; j < arraySize; j++){
                if (array[j] == s)
                {
                    array[j] = empty;
                }
            }
            if(array[i]!=empty){
                arrayNewSize++;
            }
        }
        arrayNew = new string[arrayNewSize];
        int k=0;
        for (int j = 0; j < arraySize; j++){
            if(array[j]!=empty){
                arrayNew[k++]=array[j];
            }  
        }
        return arrayNew;

} 
int main () {
    string duplicates[] = {"apple","bear","apple","daddy","bear","daddy","sunny"};
    int arraySize = (sizeof(duplicates) / sizeof(string));
    string* finalArrayP;
    finalArrayP=removeDuplicatedValues(duplicates,arraySize);
    for (int i = 0; i < arrayNewSize; i++){
        cout << "newarray[i] is  " << finalArrayP[i] << endl;
    }
    delete [] arrayNew;
    return 0;
}