此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。
答案 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
第二个参数将是元素的索引。将从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
的{{1}},它将返回"b"
,依此类推。98
返回的a.charCodeAt(0) - b.charCodeAt(0)
将sort()
数组升序。然后sort
会将数组转换为字符串。join()
将变为"abdc"
第三行是主要的。 "abcd"
是字符串org
。现在,如果任何字符串是该字符串的子字符串,则表示其字母顺序。因此,我们检查排序后的"abcdefghijklmnopqrstuvwxyz"
是否包含在字符串中。
您可以通过
清理第二行str
因为如果没有回调传递给str = str.split('').sort().join('');
,它将以默认顺序排序。平均字母顺序。