C++ 从数组C+中删除重复项+;
我正在尝试创建一个调用2个函数的简单程序。第一个函数获取一个部分填充的数组,在其中循环并删除任何重复的值。当从数组中删除一个值时,剩余的数字将向后移动以填补空白,即当函数完成时,数组的所有空值将在末尾合并在一起 第二个函数打印更新后的数组 我现在的代码如下。目前,当我运行代码时,控制台显示: 2 6 0 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460. 它应该显示:1 2 5 6如果它工作正常 另外,我不知道如何向后移动数组的其余元素,以便在最后将空值放在一起C++ 从数组C+中删除重复项+;,c++,arrays,duplicates,C++,Arrays,Duplicates,我正在尝试创建一个调用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
索引,比如iarr
只能容纳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];
}
}
}
}
}
}