#c#
Вопрос:
public int MaxNumberOfBalloons(string text)
{
// arr = {b, a, l, o, n}
int[] arr = new int[5];
foreach (char ch in text)
{
switch (ch)
{
case 'b':
Console.WriteLine(ch);
arr[0] ;
break;
case 'a':
arr[1] ;
break;
case 'l':
arr[2] ;
break;
case 'o':
arr[3] ;
break;
case 'n':
arr[4] ;
break;
default:
break;
}
}
int counter = 0;
Console.WriteLine("Before");
displayArr(arr);
while (checkArr(arr))
{
foreach (int i in arr)
{
if (i == 2 || i == 3)
{
arr[i] -= 2;
}
else
{
arr[i]--;
}
}
counter ;
}
Console.WriteLine("After");
displayArr(arr);
return counter;
}
public bool checkArr(int[] arr)
{
for (int i = 0; i < arr.Length; i )
{
if (i == 2)
{
if (arr[i] > 1)
continue;
else
return false;
}
if (i == 3)
{
if (arr[i] > 1)
continue;
else
return false;
}
if (arr[i] == 0)
return false;
}
return true;
}
Результаты теста для входной строки: text = «bb»
Вывод на консоль перед циклом while:
b
b
Before
0
2
2
2
2
Через некоторое время цикл:
After
0
2
2
2
2
counter
возвращено 1.
Вопрос: Почему оператор switch работает не так, как ожидалось?
Наблюдение: Увеличивается весь остальной индекс, кроме того, который должен. Я написал Консоль.WriteLine в случае, если предполагается, что он приземлился дважды, и это произошло, но он увеличил все остальные индексы, кроме этого.
Метод отображения очень прост: простой итератор, который выводит содержимое каждого индекса в переданном ему массиве.
В основном я просто вызываю MaxNumberOfBalloons
метод и передаю ему строку.
Комментарии:
1. Научитесь использовать отладчик. Пошагово просмотрите свой код и посмотрите, где ваша логика не работает (или где входные данные не соответствуют ожиданиям). Неясно, чего вы ожидаете от результата, чтобы знать, где все может пойти не так.
2. Вы также не показываете код
displayArr
, чтобы узнать, может ли это быть проблемой.3. И там также не указано, что находится
text
на входе. Как вы вызываете этот метод?4. Запуск вашего кода с простой реализацией
displayArr
показывает правильный вывод (по крайней мере, для «До»)5. @eglease dotnetfiddle.net/gLllOx
Ответ №1:
Я думаю, что проблема в том, с displayArr
чем .
Если я изменю его на:
for (int i = 0; i < arr.Length; i )
{
Console.WriteLine(arr[i]);
}
Вы печатаете не массив, а индекс массива на основе значения массива.
Это работает правильно.
Поэтому вместо печати arr[0]
, которая есть 2
, вы печатаете arr[arr[0]]
то же arr[2]
самое , что и то, что есть 0
.
foreach (int i in arr)
{
Console.WriteLine(i);
}
Это очень интересная ошибка, и мне потребовалось некоторое время, чтобы ее увидеть.
Комментарии:
1. Мне пришлось распечатать
i
, чтобы посмотреть, что происходит. Не так-то просто решить эту проблему.2. Я был так неправ, и я приношу извинения всем в этой теме. Это была моя вина. Спасибо вам всем.
3. Это была сложная ошибка. Не за что извиняться. Вы проделали отличную работу с dotnetfiddle. Если это решило вашу проблему, пожалуйста, отметьте ответ как решение.