子字符串索引问题

时间:2019-06-04 20:24:03

标签: javascript substring

此kata的说明:

在此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”并返回true,但是根据字母表的索引6给我g,不确定为什么要这样做,应该是索引7“ h”会根据此错误返回false。

2 个答案:

答案 0 :(得分:1)

问题是您使用的是 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"));

答案 1 :(得分:1)

您的方法也是正确的。我正在使用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

说明:

第一行:

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

用于创建字符串“ abcd .... xyz”。

  • [...Array(26)]将创建一个由26个(无字母)undefined值组成的数组。
  • map()是一个函数,该函数接受回调并根据previous的值创建一个数组。 map()回调x的第一个参数本身就是值undefined(因为数组中的所有值都是未定义的)。
  • i第二个参数将是元素的索引。将从025
  • 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()期间要比较的两个值。 ab是两个值。
  • charCodeAtString.fromCharCode相反。例如,"a".charCodeAt(0)将返回97的{​​{1}},它将返回"b",依此类推。
  • 98返回的
  • a.charCodeAt(0) - b.charCodeAt(0)sort()数组升序。然后sort会将数组转换为字符串。
  • 因此字符串join()将变为"abdc"

第三行:

第三行是主要的。 "abcd"是字符串org。现在,如果任何字符串是该字符串的子字符串,则表示其字母顺序。因此,我们检查排序后的"abcdefghijklmnopqrstuvwxyz"是否包含在字符串中。

您可以通过

清理第二行
str

因为如果没有回调传递给str = str.split('').sort().join(''); ,它将以默认顺序排序。平均字母顺序。