首页 > 解决方案 > 子字符串索引问题

问题描述

此卡塔的说明:

在这个 Kata 中,我们将检查一个字符串是否包含出现在英文字母表中的连续字母,以及每个字母是否只出现一次。

似乎我的代码在每个函数调用上对字符串进行了不同的索引。例如,在第一个测试“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" 和 return 放在一起true,而是g根据字母表的索引 6 给我,不知道为什么这样做,应该是索引 7 "h" 根据这个错误返回 false。

标签: javascriptsubstring

解决方案


问题是您使用的是substring()而不是substr()。虽然这听起来很相似,但还是有区别的。

使用 substring 时,第二个参数不会像您预期的那样确定长度。它实际上是停止的索引。您的函数使用字符串 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"));


推荐阅读