Здравей,
Прилагам ти решение на C# с два метода, но... и решението на Лора е напълно разбираемо и също ще ти помогне. Min/Max идеята ѝ за ограничаване на обсега на изтриване е готина.
Освен излизането извън колекцията при изтриването на radious-ите.... Имай предвид, че при изтриване объркваш броенето на for цикъл-а. Примерно, ако са ти останали тези двойки за изтриване:
2 2 2
В началото i = 0 и изтриваш двойка с индекс 0. На следващото кръгче i = 1, но след като си изтрил първата двойка следващата двойка е с индекс 0, но вече i = 1, а дължината на колекцията намалява (вече е 2) и в крайна сметка изпускаш да изтриваш на нулевия индекс последната двойка...
=
for (int i = 0; i < input.Count; i++)
{
input.Remove(bomb[0]);
}
=
Без да се налага да правиш корекции на броенето на i-то, може да ползваш подобно решение:
=
while (input.Contains(bomb[0]))
{
input.Remove(bomb[0]);
}
=
Сумиране на елементите на колекция. Може да ползваш вместо това:
=
for (int i = 0; i < input.Count; i++)
{
sum += input[i];
}
Console.WriteLine(sum);
=
този метод:
=
Console.WriteLine(numList.Sum());
=
===
using System;
using System.Collections.Generic;
using System.Linq;
namespace _05._Bomb_Numbers
{
class Program
{
static void Main(string[] args)
{
List<int> numList = Console.ReadLine().Split().Select(int.Parse).ToList();
int[] bombArr = Console.ReadLine().Split().Select(int.Parse).ToArray();
int itemToKill = bombArr[0];
int rangeToKill = bombArr[1];
int index = 0;
while (numList.Contains(itemToKill))
{
index = numList.IndexOf(itemToKill);
int leftRange = rangeToKill;
int rightRange = rangeToKill;
if (index - leftRange < 0) // тук ограничавам обсега на изтриване да не излиза извън индексите на колекцията
{
leftRange = index;
}
if (index + rightRange >= numList.Count) // тук ограничавам обсега на изтриване да не излиза извън индексите на колекцията
{
rightRange = numList.Count - index - 1;
}
numList.RemoveRange(index - leftRange, leftRange + rightRange + 1);
}
Console.WriteLine(numList.Sum());
}
}
}
===
Поздрави,
Иван
Здравей, хвърля OutOfRange в случая, когато трябва да премахнеш 3 числа след девятката. Тук обаче имаме само едно и махаме само него.
Тук можеш да отркриеш промерно решение на Java. :)
Браво. Страхотно решение!
Ето и едно решение само с масиви.
Извинявай колега , но би ли ми обеснил защо си задал removeRange така : numList.RemoveRange(index - leftRange, leftRange + rightRange + 1); . Аз не можех да се обесня иначе горната част е разбрах . Предварително благодаря :)
Здравей,
пробвай това за разбиране:
1 4 4 2 8 9 1
0 1 2 3 4 5 6 - индекси
9 3
===
public void RemoveRange(int index, int count); - това е обяснение на RemoveRange
numList.RemoveRange(index - leftRange, leftRange + rightRange + 1);
1.
index - leftRange -> 5 - 3 = 2 индекс (число 4), а индекс 5 е на "9"
index - leftRange -> ако е по-малко от нула се коригира в "0" - описано по-горе
2.
leftRange + rightRange + 1 - ляво + дясно + елемента на 9-та
rightRange - в този момент е извън индексите на колекцията и трябва да го намалим
rightRange = numList.Count - index - 1 -> 6 - 5 = 1
numList.Count - 1 = 6
index на 9 е = на 5
=> 6 - 5 = 1 - това е елемента в дясно
leftRange + rightRange + 1 -> 3 + 1 + 1 = 5 елемента -> 4 2 8 9 1
===
Поздрави,
Иван