我正在使用C ++ Primer进行练习。实际上,我改进了我的第一个版本。问题是我不仅要检测向量中的重复,还要检测它们被复制的次数。我对后者有困难。
这是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums{1,3,1,5,7,8,9,7};
sort(nums.begin(), nums.end());
for(unsigned int i = 0; i != nums.size(); ++i){
if(nums[i] == nums[i + 1]){
cout << nums[i] << " is a duplicated number" << endl;
}
}
return 0;
}
编辑:还注意到我的逻辑存在缺陷。如果一个数字出现超过两次,它将多次打印出来,它是重复的。这是多余的。
答案 0 :(得分:0)
一个愚蠢但快速的解决方案:
#include <map>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> nums{1,3,1,5,7,8,9,7,1};
std::map<int, int> dups;
for(int i : nums)
++dups[i];
for(auto& dup : dups)
cout << "Number " << dup.first << " has " << dup.second - 1 << " duplicates\n";
}
答案 1 :(得分:0)
使用std::map
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
map<int, int> duplicate;
vector<int> nums{1,3,1,5,7,8,9,7,1};
vector<int> nums_sorted{nums};
sort(begin(nums_sorted), end(nums_sorted));
auto beg = begin(nums_sorted) + 1;
for (;beg != end(nums_sorted); ++beg) {
if (*beg == *(beg - 1)) {
duplicate[*beg]++;
}
}
for (const auto& i : duplicate)
cout << i.first << " appear " << i.second+1 << " times" << '\n';
}
输出:
1 appear 3 times
7 appear 2 times
答案 2 :(得分:0)
你几乎就在那里,这是我建议的解决方案:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums{1,3,1,5,7,8,9,7};
sort(nums.begin(), nums.end());
for(auto it = std::cbegin(nums); it != std::cend(nums); ) {
int dups = std::count(it, std::cend(nums), *it);
if ( dups > 1 )
cout << *it << " is a duplicated number, times: " << dups << endl;
for(auto last = *it;*++it == last;);
}
return 0;
}
答案 3 :(得分:0)
您可以将std::distance<>()
与std::sort(nums.begin(), nums.end());
auto unique_end = std::unique(nums.begin(), nums.end());
std::cout << std::distance(nums.begin(), unique_end);
配对:
forms.py