Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从数组C+中删除重复项+;_C++_Arrays_Duplicates - Fatal编程技术网

C++ 从数组C+中删除重复项+;

C++ 从数组C+中删除重复项+;,c++,arrays,duplicates,C++,Arrays,Duplicates,我正在尝试创建一个调用2个函数的简单程序。第一个函数获取一个部分填充的数组,在其中循环并删除任何重复的值。当从数组中删除一个值时,剩余的数字将向后移动以填补空白,即当函数完成时,数组的所有空值将在末尾合并在一起 第二个函数打印更新后的数组 我现在的代码如下。目前,当我运行代码时,控制台显示: 2 6 0 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460. 它应该显示:1 2 5 6如果它工作正

我正在尝试创建一个调用2个函数的简单程序。第一个函数获取一个部分填充的数组,在其中循环并删除任何重复的值。当从数组中删除一个值时,剩余的数字将向后移动以填补空白,即当函数完成时,数组的所有空值将在末尾合并在一起

第二个函数打印更新后的数组

我现在的代码如下。目前,当我运行代码时,控制台显示: 2 6 0 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460. 它应该显示:1 2 5 6如果它工作正常

另外,我不知道如何向后移动数组的其余元素,以便在最后将空值放在一起

#include "pch.h"
#include <iostream>
using namespace std;
void deleteRepeats(int *arr, int arraySize, int& posUsed);
void printArray(int *arr, int arraySize);

int main()
{
int arr[10] = { 1, 2, 2, 5, 6, 1};
int posUsed = 6;
int arraySize = 10;


deleteRepeats(arr, arraySize, posUsed);
printArray(arr, arraySize);

return 0;
}

void deleteRepeats(int *arr, int arraySize, int& posUsed)
{
{
    for (int i = 0; i < arraySize; i++)
    {
        for (int j = i; j < arraySize; j++)
        {
            if (arr[i] == arr[j])
            {
                for (int k = j; k < arraySize; k++)
                {
                    arr[k] = arr[k + 1];

                }
                posUsed--;

            }
            else
                j++;
        }
    }
}
}

void printArray(int *arr, int arraySize)
{
for (int i = 0; i < arraySize; i++)
{
    cout << arr[i] << "  ";
}
}
#包括“pch.h”
#包括
使用名称空间std;
void delete repeats(int*arr、int arraySize、int&posUsed);
void printary(int*arr,int arraySize);
int main()
{
int-arr[10]={1,2,2,5,6,1};
int=6;
int-arraySize=10;
删除重复(arr、arraySize、posUsed);
打印阵列(arr,arraySize);
返回0;
}
void delete repeats(int*arr、int arraySize、int&posUsed)
{
{
for(int i=0;i我会让性病容器去做你想做的事

  • 对向量排序
  • 使用
    erase
    unique
    删除重复项
这是密码

#include <vector>
#include <iostream>
#include <algorithm>

void print(const std::vector<int> &arr){
    for (const auto & i : arr){
        std::cout << i <<" ";
    }
    std::cout <<"\n";
}

int main() {
    std::vector<int> arr{1, 2, 2, 5, 6, 1};    
    print(arr);

    std::sort( arr.begin(), arr.end() );
    arr.erase( std::unique( arr.begin(), arr.end() ), arr.end() );

    print(arr);
}
#包括
#包括

#include

可以更容易地想象算法具有单独的输入和输出数组。然后,在伪代码中:

for i = 0 to input_array_size-1
    Is input[i] equal to input[j] for any j between 0 and i-1?
    Yes - do nothing
    No - copy input[i] to output
要通过共享输入和输出实现这一点,您需要有两个数组大小,
input\u array\u size
output\u array\u size
。然后,伪代码变为

output_array_size = 0
for i = 0 to input_array_size-1
    Is array[i] equal to array[j] for any j between 0 and output_array_size-1?
    Yes - do nothing
    No:
        copy array[i] to array[output_array_size]
        Increase output_array_size
注意:它将输出写入输入曾经所在的位置,因此检查重复项时应查看输出的所有元素。例如,如果您的数组是
1、2、1、3、5、6、3
,则对于最后一个
3
,累积输出是
1、2、3、5、6
,代码应将所有这些元素与当前元素进行比较



为了简化调试,当它说“不做任何事情”时,您可以将当前元素设置为-1。这样,如果您在执行期间打印数组(用于调试),将更清楚删除哪些元素。

鉴于您的赋值约束(更像C,而不是惯用C++),您可以像这样重写函数,使其工作:

void deleteRepeats(int *arr, int arraySize, int& posUsed)
{
    for (int i = 0; i < posUsed; ++i)
    {
        int duplicates = 0;
        int j = i + 1;
        // find the first duplicate, if exists
        for ( ; j < posUsed; ++j)
        {
            if ( arr[i] == arr[j] ) {
                ++duplicates;
                break;
            }
        }
        // overwrite the duplicated values moving the rest of the elements...
        for (int k = j + 1; k < posUsed; ++k)
        {
            if (arr[i] != arr[k])
            {
                arr[j] = arr[k];
                ++j;
            }
            // ...but skip other duplicates
            else
            {
                ++duplicates;    
            }
        }
        posUsed -= duplicates;
    }
    // clean up (could be limited to the duplicates only)
    for (int i = posUsed; i < arraySize; ++i)
        arr[i] = 0;
}
void delete repeats(int*arr、int arraySize、int&posUsed)
{
对于(int i=0;i
使用两个指针
如果数组排序

    int removeDuplicates(vector<int>& nums) {
        if(nums.size() == 0) return 0;
        int i = 0;

        for(int j = 1; j < nums.size(); j++)
            if(nums[j] != nums[i])  nums[++i] = nums[j];

        // return new array length
        return i + 1;
    }

正如您所看到的,只有两个更改


1:您正在遍历整个数组,因为您声明了一个
posUsed=6
变量,这是因为只有6个元素,所以在in循环中,您需要遍历数组中的
posUsed
索引,比如
i
arr
只能容纳6个元素,但您设置了
arraySize=10
。您可以更改为
int-arr[10] ={1,2,2,5,6,1};
是否有可能使用
std::vector
std::array
?谢谢@johnymopp,我已经纠正了这个问题。虽然我对控制台没有显示输出也有同样的问题。Micha,我的讲师不希望我们使用向量,因为我们还没有讨论过它们yetAlso,
arr[k]=arr[k+1]当
k=arraySize-1
时,
将读取数组的末尾。在
for
循环中,您需要使用
posUsed
而不是
arraySize
。OP在注释中声明:我的讲师不希望我们使用向量sop无法使用标准库算法进行该赋值。此外,在您的解决方案中,结果数组也可以不需要使用.<代码> >每个从vector中构造一个集合。@ pTaq666好点。我替换了<代码> >每个。这增加了const正确性。@ JNYMYOPP在发布答案之前我没有读过这个注释。然而,教C++没有适当的容器是IHMO不是T。如果使用了<代码> STD::向量,没有任何意义。在Suthtrup中,C++应该被教如 > C++ > /CODE。在这里,算法函数的OP状态不能被使用。我看它们不能使用<代码>向量< /代码>,但是<代码>向量< /代码>不是ALGO。里思函数。
//input: [1, 1, 2, 1] (arr1)
//output: 2 (returned length)
// print unique element
for(int i = 0; i < output; i++) cout << arr1[i] << '\n';
// [1, 2]
time complexity: O(N/2) -> O(N)
space complexity: O(1)
void deleteRepeats(int *arr, int arraySize, int& posUsed)
{
{
    for (int i = 0; i < posUsed; i++)
    {
        for (int j = i+1; j < posUsed; j++)
        {
            if (arr[i] == arr[j])
            {
                for (int k = j; k < posUsed; k++)
                {
                    arr[k] = arr[k + 1];
                    
                }
            }
        
        }
    }
}
}