我正在尝试编写一个函数,它接受字符串中的唯一值,将它们一起移到左边,然后将重复的值设置为空字符串。我希望我的函数返回多少个值被更改为空字符串。
我的阵列是 {“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);;
}
答案 0 :(得分:3)
这可以使用for
循环中的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());
答案 1 :(得分:3)
跟随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);;
}
答案 2 :(得分:0)
从第4位移开第2只熊后,第3只熊移动到那个位置,然后你继续从第5位开始寻找熊,你错过了它。尝试将if
替换为while
,以便在递增j
之前继续移除空头。