Почему мы сделали {i <s.length () - k} в for для l oop. Пожалуйста, объясните логи c. Given string s и int k - PullRequest
0 голосов
/ 27 апреля 2020

Это решение лексикографии c наименьшая и наибольшая строка, в которой у нас есть вход Sting s и int k; k - длина требуемой наименьшей и наибольшей строки. Пожалуйста, go через этот вопрос о ссылке, и он Statementhackerrank.com/challenges/java-string-compare/problem Мне не нужно никаких исправлений или так. То, что я хочу, это объяснение "" для l oop "" Что такое логика c за этим i String smallest = s.substring(0, k); // Assume String largest = s.substring(0, k); String temp; for(int i = 0; i < s.length() - k + 1;i++)<<<==== please Explain logic in this line { temp = s.substring(i, i + k); if(smallest.compareTo(temp) > 0) smallest = temp; if(largest.compareTo(temp) < 0) largest = temp; } return smallest + "\n" + largest; }

Ссылка: https://www.hackerrank.com/challenges/java-string-compare/problem

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Давайте go с начала

Предположим, у нас есть строка "abcd", поэтому мы вырезали наименьшее и наибольшее из индекса от 0 до 2 - это подстрока "ab"

Затем в l oop i изменяется с 0 на 3 (4-2 + 1 -> 3) - он может начинаться с 1, кстати, потому что мы уже обработали "ab";

i = 0, в строке tmp = s.substring(i, i+k) мы вырезали первую подстроку из «abcd», начиная с индекса 0 до 0 + 2-> 2 -> «ab»;

следующая итерация: i ++ -> i = 1: вырезать 2-я подстрока из индекса 1 в 1 + 2 -> 3 -> "b c" - она ​​больше, чем "ab", поэтому мы храним наибольшую = "b c";

следующая итерация : i ++ -> i = 2; обнаружить 3-ю подстроку из индекса 2 в 2 + 2-> 4 -> "cd" - она ​​больше, чем "b c", поэтому мы храним "cd"

i ++ -> 3, выходя из l oop, в противном случае мы попытаемся получить подстроку из индекса 3 в индекс 5, что вызвало бы исключение, о котором я упоминал 2 дня go.

Это объяснение отвечает на ваш вопрос?

0 голосов
/ 27 апреля 2020
for(int i = 0; i < s.length() - k + 1;i++)

В этой строке мы гарантируем, что 'i' не будет go по всей длине строки, что приведет к исключению IndexOutOfBounds.

Например, в следующем фрагменте кода Обратите внимание, что внутри для l oop мы обращаемся к индексу i + 1, поэтому условие в for l oop записывается как 'i for(int i = 0; i < s.length() - 1; i++){ if(s.charAt(i+1) == s.charAt(i){ ... ... } } Переменная' i 'перемещается от индекса 0 к s.length () - 1, когда для l oop это примерно так:

for(int i = 0; i < s.length(); i++)

Переменная 'i' переместится из индекса 0 в s.length () - k, когда для l oop будет выглядеть так:

for(int i = 0; i < s.length()-k; i++)

Но так как мы используем подстроку функция и в этой функции, индекс окончания не включен, мы добавляем 1 в for для l oop:

for(int i = 0; i < s.length()-k+1; i++)

Надеюсь, я очистил ваши сомнения. Не пугайтесь этого длинного объяснения и не торопитесь, чтобы понять, что я пытался передать.

...