Итак, я немного освежился в c ++ и обнаружил, что я очень ржавый по сравнению с другими моими языками.Я работал над этой проблемой с codewars.com
Учитывая список lst и число N, создайте новый список, который содержит каждое число lst не более N раз без переупорядочения.Например, если N = 2, а ввод [1,2,3,1,2,1,2,3], вы берете [1,2,3,1,2], отбрасываете следующее [1,2], поскольку это приведет к тому, что 1 и 2 будут в результате 3 раза, а затем - 3, что приводит к [1,2,3,1,2,3].
Для этогоЗадача Я хотел создать многомерный вектор для хранения уникальных значений предоставленного списка в первом измерении и соответствующего числа вхождений во втором измерении.Тем не менее, я был незнаком с синтаксисом c ++, чтобы выполнить это, поэтому я просто создал 2 отдельных вектора. (Instance, countOfInstance)
По сути, мой алгоритм будет делать:
- , проходить черезпредоставленный массив (arr)
- проверяет, не существует ли значение в "arr" в "экземплярах"
- Если не найдено, тогда передайте значение в "arr" в "instances",
- добавить значение подсчета 1, соответствующее этому индексу в "countOfInstance"
- , а затем добавить значение в "arr" в nFilteredVector.
Если значение в "arr" найдено в "экземплярах", то:
- Найти значение индекса "arr" в "экземплярах"
- Используйте этот индекс, чтобы найти соответствующее значение счетчика в "countOfInstances"
- Определите, является ли счет меньше, чем предоставленное "N"
- , если меньше "N", добавьте к "nFilteredVector"
- Затем увеличиваем значение в "countOfInstances"
Однако, когда я пытаюсь получить доступ к индексу "CountOfInstances" с индексом "instances", я получаю странную ошибку
нет жизнеспособного перегруженного оператора [] для типа 'std :: vector' if (countOfInstances [std :: find (instances.begin (), instances.end (), arr [i])] <= 2){</p>
Исправьте меня, если я ошибаюсь, но, насколько я понимаю, функция find возвращает значение индекса найденного элемента.Я хотел использовать это значение индекса для доступа к вектору countOfInstances.
Может кто-нибудь помочь мне разобраться в правильном синтаксисе того, что я ищу.Бонусные баллы за интеграцию «экземпляров» и «countOfInstance» в качестве многомерного вектора !!
#include <algorithm>
std::vector<int> deleteNth(std::vector<int> arr, int n)
{
std::vector<int> nFilteredVector;
std::vector<int> instances;
std::vector<int> countOfInstances;
for (int i =0; i < arr.size();i++){
if(std::find(instances.begin(), instances.end(),arr[i])==instances.end()){//value not found need to add corresponding value to instances vector then add an element of 1 to the correpeonding index of the countOfInstance vector.
instances.push_back(arr[i]);
countOfInstances.push_back(1);
nFilteredVector.push_back(arr[i]);
}else{ // value is found just need to increment the value in countOfInstances
//find the instance of the value in arr in the instance vector, use that value to find the corresponding value in countOfInstance
if (countOfInstances[std::find(instances.begin(), instances.end(),arr[i])] <=n){
nFilteredVector.push_back(arr[i]);
}
countOfInstances[std::find(instances.begin(), instances.end(),arr[i])]++;
}
return nFilteredVector;
}
Вот несколько примеров того, какие кодовые войны будут тестироваться для
{
Assert::That(deleteNth({20,37,20,21}, 1), Equals(std::vector<int>({20, 37, 21})));
Assert::That(deleteNth({1,1,3,3,7,2,2,2,2}, 3), Equals(std::vector<int>({1, 1, 3, 3, 7, 2, 2, 2})));
}