Что произойдет, если утверждение выполнится (в этом коде)? - PullRequest
0 голосов
/ 21 марта 2020

В codingbat.com существует проблема, из-за которой вы должны удалить подстроку "yak" из исходной строки. и они предоставили решение для того, что я не могу понять, что происходит, когда утверждение if становится правдой!

public String stringYak(String str) {
  String result = "";

  for (int i=0; i<str.length(); i++) {
    // Look for i starting a "yak" -- advance i in that case
    if (i+2<str.length() && str.charAt(i)=='y' && str.charAt(i+2)=='k') {
      i =  i + 2;
    } else { // Otherwise do the normal append
      result = result + str.charAt(i);
    }
  }

  return result;
}

Это просто складывает i на 2 и что? Когда он добавляется к строке результата?

Ссылка на проблему: https://codingbat.com/prob/p126212

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Предоставленное решение проверяет все одиночные символы во входной строке. Для этого i - текущий индекс проверяемого символа. Если текущий символ не является y, а также символ (i+2) не является k, то текущий индекс символа увеличивается на 1 позицию.

Пример:

yakpak
012345
i

Итак, здесь в первой итерации символ в i равен y, а i+2 - это k, поэтому мы должны пропустить 3 символа. Имейте в виду, i увеличивается на 1 каждый раз. Так что я должен быть увеличен еще на 2. После этой итерации i здесь

yakpak
012345
   i

Итак, текущий символ не равен y, и этот символ будет добавлен в строку результата.

Но в * это еще проще 1027 *, поскольку эта функциональность встроена в регулярное выражение:

public String stringYak(String str) {
  return str.replaceAll("y.k","");
}

. означает каждый символ.

0 голосов
/ 21 марта 2020

Если i указывает на y и есть как k две позиции вниз, то он хочет пропустить полную подстроку y*k, поэтому он добавляет 2 к i, поэтому i теперь относится к k. Когда затем l oop продолжается, i++ пропустит k, поэтому вся 3-буквенная подстрока y*k была пропущена.

...