Фон:
Привет, сейчас я изучаю C# и практикуюсь в HackerRank.
Итак, я столкнулся с проблемой лестницы, которую я должен закодировать для получения целочисленного ввода, а затем вывести «диаграмму» лестницы, используя пробелы и хэши.
Столкнулся с проблемой:
Приведенные ниже коды дают мне ошибку выполнения, в которой говорится: «System.ArgumentOutOfRangeException: длина не может быть меньше нуля».
// Complete the staircase function below.
static void staircase(int n) {
// Find number of spaces needed
string space = "";
for (int i = 1; i < n; i++) {
space += " ";
}
string hash = "#";
for (int j = 0; j < n; j++) {
space = space.Substring(0, space.Length - j);
Console.WriteLine(space + hash);
hash += "#";
}
}
Однако, когда я меняю код во втором цикле for
с
space = space.Substring(0, space.Length - j);
Console.WriteLine(space + hash);
в Console.WriteLine(space.Substring(0, space.Length - j) + hash);
Затем он работает успешно, я не вижу разницы и не понимаю, почему это работает?
Да, я хотел сделать space
короче каждую петлю. Спасибо
Если space.Length
— это 0
, а j
— это (например) 5
, какой длины строки, по вашему мнению, space.Length - j
запрашивает для этого? -5
, верно? Это то, на что я указывал.
Ах, я вижу, это тоже моя изначальная путаница! i tot после первого цикла (используя 5
в качестве входных данных), space.Length
будет равно 5? (спасибо за помощь)
Вы можете посмотреть, что происходит здесь. В конечном итоге вы получите space.Length
значение 1
и значение j = 3
, так что space.Length - j = -2
Цените это, сенсей :)
Эти двое не одинаковы.
Эта строка:
Console.WriteLine(space.Substring(0, space.Length - j) + hash);
похоже на это:
string temporarySpace = space.Substring(0, space.Length - j);
Console.WriteLine(temporarySpace + hash);
Там вы не изменяете переменную space
, вместо этого вы создаете временную
Я изменил ваш код, чтобы вы могли видеть это поведение: https://dotnetfiddle.net/ZhXIWa
for (int j = 0; j < n; j++) {
var tempSpace = space.Substring(0, space.Length - j);
Console.Write($"space: {space.Length} | ");
Console.Write($"tempSpace: {tempSpace.Length} | ");
Console.Write(space + hash);
Console.Write(Environment.NewLine);
hash += "#";
}
// Output
space: 9 | tempSpace: 9 | #
space: 9 | tempSpace: 8 | ##
space: 9 | tempSpace: 7 | ###
space: 9 | tempSpace: 6 | ####
space: 9 | tempSpace: 5 | #####
space: 9 | tempSpace: 4 | ######
space: 9 | tempSpace: 3 | #######
space: 9 | tempSpace: 2 | ########
space: 9 | tempSpace: 1 | #########
space: 9 | tempSpace: 0 | ##########
Там вы увидите, сколько символов имеют обе переменные (пробел и временное пространство). Вы можете изменить код на тот, который не работает, и вы увидите разницу :)
space = space.Substring(0, space.Length - j);
- С этим кодом вы постоянно делаетеspace
короче, верно? Только сConsole.WriteLine(space.Substring(0, space.Length - j) + hash);
вы не меняетесьspace
.