Предположим, что у вас есть отсортированный диапазон (от x до y) значений в массиве.Найти все дубликаты и отсутствующие значения в отсортированном массиве
x = 3;
y = 11;
array == 3, 4, 5, 6, 7, 8, 9, 10, 11
Но вполне возможно, что некоторые значения дублируются и некоторые из них не хватает, так что вы можете иметь:
array == 4, 5, 5, 5, 7, 8, 9, 10, 10
Какой самый лучший способ на вашем языке, чтобы найти все дубликаты и недостающие значения, так что вы получите :
resultMissingValuesArray == 3, 6, 11
resultDuplicatesArray == 5, 5, 10
Вот некоторые C++ код, чтобы вы начали:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int kLastNumber = 50000; // last number expected in array
const int kFirstNumber = 3; // first number expected in array
int main()
{
vector<int> myVector;
// fill up vector, skip values at the beginning and end to check edge cases
for(int x = kFirstNumber + 5; x < kLastNumber - 5; x++)
{
if(x % 12 != 0 && x % 13 != 0 && x % 17 != 0)
myVector.push_back(x); // skip some values
else if(x % 9 == 0)
{
myVector.push_back(x); // add duplicates
myVector.push_back(x);
}
else if(x % 16 == 0)
{
myVector.push_back(x); // add multiple duplicates
myVector.push_back(x);
myVector.push_back(x);
myVector.push_back(x);
}
}
// put the results in here
vector<int> missingValues;
vector<int> duplicates;
// YOUR CODE GOES HERE
// validate missingValues for false positives
for(int x = 0; x < (int) missingValues.size(); ++x)
{
if(binary_search(myVector.begin(), myVector.end(), missingValues.at(x)))
cout << "Oh noes! You missed an unmissed value. Something went horribly, horribly wrong.";
}
// validate duplicates (I think... errr)
vector<int>::iterator vecItr = myVector.begin();
vector<int>::iterator dupItr = duplicates.begin();
while(dupItr < duplicates.end())
{
vecItr = adjacent_find(vecItr, myVector.end());
if(*vecItr != *dupItr)
cout << "Oh noes! Something went horribly, horribly wrong.";
// oh god
while(++dupItr != duplicates.end() && *(--dupItr) == *(++dupItr) && *vecItr == *(++vecItr));
++vecItr;
}
return 0;
}
Я не тестировал детали валидации, поэтому может быть что-то не так с ними (особенно с дубликатами).
Я отправлю свое решение в качестве ответа.
Вздох. Это намного приятнее. Сначала я пытался сделать это как цикл for, но я как-то поступил неправильно и оказался в этом, пока мерзость. Спасибо за этот ответ. (последняя строка должна отсутствовать .add (j), хотя, я думаю) – drby
Хороший catch (и if-statement также). Проверка на x и y была добавлена позже, как только я правильно прочитал вопрос :-), и я подумал, что я позабочусь о возможности, когда x и y не обязательно являются конечными точками данных. – paxdiablo