将唯一值转移到左侧,并在字符串中删除重复的值

Shifting unique values to the left and removing duplicated values in a string

本文关键字:字符串 删除 转移 唯一      更新时间:2023-10-16

我正在尝试编写一个函数,该函数将唯一值在字符串中,将它们全部转移到左侧,然后将重复的值设置为一个空字符串。我希望我的功能返回将多少个值更改为一个空字符串。

我的数组是 {" Cindy"," Sasha"," Cindy"," Daisy"," Bear"," Bear"," Bear"};但是我似乎一次跳过"熊"一次,只返回2.

例如,我不能这样做

int duplicaterase(string array[], int  n)
{
const auto end = array + n;
auto finish = end;
for (auto start = array; start != finish; ++start) {
    finish = std::remove(start+1, finish, *start);
}
std::fill(finish, end, std::string());
return static_cast<int>(end - finish);;
}

这可以简单地使用for -loop中的remove完成。

auto finish = end(duplicates1);
for(auto start = begin(duplicates1); start != finish; ++start) finish = remove(next(start), finish, *start);
fill(finish, end(duplicates1), string());

实时示例


上述解决方案保留顺序,但最快的解决方案将是sort并使用unique

sort(begin(duplicates1), end(duplicates1));
fill(unique(begin(duplicates1), end(duplicates1)), end(duplicates1), string());

实时示例

跟进乔纳森·梅(Jonathan Mee(的答案,这是C 这样做的方法。

#include <algorithm>
int removeDuplicatedValues(string array[], int  n)
{
    const auto end = array + n;
    auto finish = end;
    for (auto start = array; start != finish; ++start) {
        finish = std::remove(start+1, finish, *start);
    }
    std::fill(finish, end, std::string());
    return static_cast<int>(end - finish);;
}

从位置4删除第二熊后,第三熊移至该位置,然后您继续从位置5开始寻找熊,然后错过了它。尝试通过while替换最后一个if,以继续删除熊,然后再增加j