проблема с индексацией подстроки - PullRequest
1 голос
/ 04 июня 2019

Инструкции для этого ката:

В этом ката мы проверим, содержит ли строка последовательные буквы в том виде, в каком они присутствуют в английском алфавите, и встречается ли каждая буква только один раз.

Кажется, мой код по-разному индексирует строки для каждого вызова функции. например, в первом тесте «abcd» начальный индекс отображается как 0, что является правильным, а во втором примере, «himjlk»,

 var subString = alphabet.substring(startIndex, length);

возвращает «g» вместо «h»

поиск и устранение неисправностей в этом разделе

var length = orderedString.length;
  //startChar for string comparison
  var startChar = orderedString.charAt(0);
  //find index in aphabet of first character in orderedString.
  var startIndex = alphabet.indexOf(startChar);
  //create substring of alphabet with start index of orderedString and //orderedString.length
  var subString = alphabet.substring(startIndex, length);

function solve(s) {
  //alphabet string to check against
  const alphabet = `abcdefghijklmnopqrstuvwxyz`;
  //check s against alphabet
  //empty array to order input string
  var ordered = [];
  //iterate through alphabet, checking against s
  //and reorder input string to be alphabetized
  for (var z in alphabet) {
    var charToCheck = alphabet[z];
    for (var i in s) {
      if (charToCheck === s[i]) {
        ordered.push(s[i]);
      }
      //break out of loop if lengths are the same
      if (ordered.length === s.length) {
        break;
      }
    }
    if (ordered.length === s.length) {
      break;
    }
  }
  //join array back into string
  var orderedString = ordered.join(``);
  //length for future alphabet substring for comparison
  var length = orderedString.length;
  //startChar for string comparison
  var startChar = orderedString.charAt(0);
  //find index in aphabet of first character in orderedString.
  var startIndex = alphabet.indexOf(startChar);
  //create substring of alphabet with start index of orderedString and orderedString.length
  var subString = alphabet.substring(startIndex, length);

  //return if the two are a match
  return subString == orderedString ? true : false;
}

console.log(solve("abdc")); //expected `true`
console.log(solve("himjlk")); // expected `true`

console.log(solve("abdc")); должен предоставить подстроку "abcd" и вернуть true, что он и делает.

console.log(solve("himjlk")); должен сложить "hijklm" и вернуть true, но вместо этого дает мне g на основе индекса 6 алфавита, не уверен, почему он это делает, должен быть индекс 7 "h" возвращает false на основе эта ошибка.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы подходите также правильно. Я даю другое решение, используя sort() и charCodeAt. Вместо того, чтобы получить индекс и затем разбить строку на части для сравнения, просто используйте includes()

function check(str){
  let org = [...Array(26)].map((x,i) => String.fromCharCode(i + 97)).join('');
  str = str.split('').sort((a, b) => a.charCodeAt(0) - b.charCodeAt(0)).join('');
  return org.includes(str);
}
console.log(check("abdc"))//true
console.log(check("himjlk"));//true

console.log(check("himjlkp"));//false

Пояснение:

Frist Line:

let org = [...Array(26)].map((x,i) => String.fromCharCode(i + 97)).join('');

используется для создания строки "abcd .... xyz".

  • [...Array(26)] создаст массив из 26 (без алфавитов) undefined значений.
  • map() - это функция, которая принимает обратный вызов и создает массив на основе значений предыдущего. Первым параметром map() callback x является само значение, которое будет undefined (поскольку все значения в массиве не определены).
  • i вторым параметром будет индекс элемента. Который начнется с 0 до 25.
  • String.fromCharCode - это функция, которая принимает код символа (целое число) и затем преобразует его в строку. Например, код символа для a равен 97, поэтому String.fromCharCode(97) вернет "a". 98 для "b", 99 для "c" и т. Д.
  • Таким образом, после map() будет сгенерирован массив типа ["a","b"....,"z"]. - join() преобразует это в строку

Вторая строка:

  • str заданная строка. str.split('') преобразует строку в массив. Например если str равно "abdc", то вернется ["a","b","d","c"]
  • sort() - метод массива, который принимает обратный вызов. Два параметра - это два значения, которые будут сравниваться во время sort(). a и b - это два значения.
  • charCodeAt действует в обратном порядке как String.fromCharCode. Например, "a".charCodeAt(0) будет возвращено 97 для "b", будет 98 и т. Д.
  • a.charCodeAt(0) - b.charCodeAt(0), который возвращается из sort() будет sort массив в порядке возрастания. И join() преобразует массив в строку.
  • Так строка "abdc" станет "abcd"

Третья строка:

Третья строка является основной. org это строка "abcdefghijklmnopqrstuvwxyz". Теперь, если любая строка является подстрокой этой строки, это означает, что она в алфавитном порядке. Поэтому мы проверяем, отсортировано ли str, включено в строку или нет.

Вы можете очистить вторую строку,

str = str.split('').sort().join('');

Потому что, если обратный вызов не передан sort(), он будет отсортирован в порядке по умолчанию. Средний алфавитный порядок.

1 голос
/ 04 июня 2019

Проблема в том, что вы используете substring () вместо substr () .Хотя это может звучать похоже, есть разница.

С подстрокой второй параметр не определяет длину, как вы могли ожидать.Это на самом деле индекс, чтобы остановить.То, что ваша функция работает должным образом со строкой abcd, является чистым совпадением, поскольку в этом случае длина индекса 0 и индекса конца совпадают.

function solve(s){
  const alphabet = `abcdefghijklmnopqrstuvwxyz`;
  var ordered = [];
  for(var z in alphabet){
    var charToCheck = alphabet[z];
    for(var i in s){
      if(charToCheck === s[i]){
        ordered.push(s[i]); 
      }
      if(ordered.length === s.length){ break; }
    }
    if(ordered.length === s.length){ break; }
  }
  var orderedString = ordered.join(``);
  var length = orderedString.length;
  var startChar = orderedString.charAt(0);
  var startIndex = alphabet.indexOf(startChar);
  var subString = alphabet.substr(startIndex, length);

  return subString == orderedString ? true: false;
}

console.log(solve("himjlk"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...