数组中的重复值
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;
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '