数组中的重复值

Duplicated Values in Array

本文关键字:数组      更新时间:2023-10-16

我正在尝试在主范围内编写一个函数,该功能在字符串数组中的重复值扫描而不使用任何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;
}

首先。您不能从数组中"删除"值。根据定义,数组是固定尺寸。您的 can 做的是覆盖重复值并将唯一的值转移到左侧。您可以这样做,同时跟踪阵列的新大小应该是什么(在内存中它仍然是相同的大小,但是出于实际目的,我们不再关心最后的内容(。我希望您不要介意使用可变名称进行清理。我这样做是为了明确意图。该函数将返回具有唯一值的"新"数组的大小。

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

如果您想知道从阵列中"删除"了多少重复,则可以使用简单的数学来完成。由于您知道固定尺寸(在这种情况下为7(,并且从我们功能返回的length变量具有唯一元素的数量。

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

重复替换为空字符串后,您在进一步的i上计算"" == ""重复。您应该在Cout中看到它。

而不是分配空字符串,我将交换array[j]array[n - 1]和降低n

您可以使用此代码。

#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;
}