所以我已经在这个编码挑战上工作了大约一天,我仍然觉得我没有触及表面,即使它应该很容易。问题要求我们取一个字符串参数,如果字母'a'和'b'之间正好有3个字符(不包括空格),则应该为真。
示例:Input: "maple bread"; Output: false // Because there are > 3 places
Input: "age bad"; Output: true // Exactly three places in between 'a' and 'b'
以下是我所写的,虽然它尚未完成,而且很可能是写错了方向:
function challengeOne(str) {
let places = 0;
for (let i=0; i < str.length; i++) {
if (str[i] != 'a') {
places++
} else if (str[i] === 'b'){
}
}
console.log(places)
}
所以我的想法是在字母 'a' 之后开始计算位置,直到它到达 'b',然后它会返回位置的数量。然后我会开始另一个流程,如果 'places' > 3,则返回 false 或者如果 'places' === 3,则返回 true。
但是,尝试第一个流只会返回不是“a”的地方的总数。我正在使用 console.log 而不是返回来测试它是否有效。
我只是想朝正确的方向推动,如果有我可能缺少的方法,或者是否有其他类似的例子。我觉得解决方案很简单,但我似乎无法掌握。
编辑:
我从这个挑战中休息了一下,这样我就可以用全新的眼光看待它,并且能够快速解决它!我查看了每个人的建议并应用它,直到找到解决方案。这是有效的新代码:
function challengeOne(str) {
// code goes here
str = str.replace(/ /g, '')
let count = Math.abs(str.lastIndexOf('a')-str.lastIndexOf('b'));
if (count === 3) {
return true
} else return false
}
感谢您的所有投入!
答案 0 :(得分:0)
这里有一个更有效的方法 - 只需找到字母 a
和 b
的索引并检查两者相减的绝对值是否为 4(因为索引为 0 索引):
function challengeOne(str) {
return Math.abs(str.indexOf("a") - str.indexOf("b")) == 4;
}
console.log(challengeOne("age bad"));
console.log(challengeOne("maple bread"));
如果正好有 3 个字符(不包括空格)
只需通过 String#replace
删除所有空格,然后执行检查:
function challengeOne(str) {
return str = str.replace(/ /g, ''), Math.abs(str.indexOf("a") - str.indexOf("b")) == 4;
}
console.log(challengeOne("age bad"));
console.log(challengeOne("maple bread"));
参考文献:
答案 1 :(得分:0)
我假设空格是,并且您的示例似乎表明了这一点,尽管您的问题另有说明。如果是这样,这里的推送应该会有所帮助。你说得对,有一些用于字符串的 JavaScript 方法,包括一种可以帮助您找到给定字符串中 a 和 b 的索引(位置)的方法。
答案 2 :(得分:0)
这是另一种方法:这种方法排除了 OP 中的空格,因此输出反映了这一点。如果要包含空格,则可以删除该行。
function challengeOne(str) {
//strip spaces
str = str.replace(/\s/g, '');
//take just the in between chars
let extract = str.match(/a(.*)b/).pop();
return extract.length == 3
}
console.log(challengeOne('maple bread'));
console.log(challengeOne('age bad'));
答案 3 :(得分:0)
你可以递归:
'a'
开头并以'b'
结尾并检查长度示例:
maple bread
aple brea
aple bre
aple br
aple b
ple
le
FALSE
age bad
age ba
age b
TRUE
const check = (x, y, z) => str => {
const exec = s => {
const xb = s.startsWith(x);
const yb = s.endsWith(y);
return ( !s ? false
: xb && yb && s.length === z + 2 ? true
: xb && yb ? exec(s.slice(1, -1))
: xb ? exec(s.slice(0, -1))
: exec(s.slice(1)));
};
return exec(str);
}
const challenge = check('a', 'b', 3);
console.log(`
challenge("maple bread"): ${challenge("maple bread")}
challenge("age bad"): ${challenge("age bad")}
challenge("aabab"): ${challenge("aabab")}
`)