【问题标题】:Check length between two characters in a string检查字符串中两个字符之间的长度
【发布时间】:2021-07-21 23:51:28
【问题描述】:

所以我已经为这个编码挑战工作了大约一天,但我仍然觉得我还没有触及表面,即使它被认为是简单的。问题要求我们取一个字符串参数,如果字母 '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 而不是 return 来测试它是否有效。

我只是在寻找正确的方向,如果有一种方法我可能会丢失,或者是否有其他类似的例子。我觉得解决方案很简单,但我似乎无法掌握它。

编辑:

我从这个挑战中休息了一下,以便我能以新的眼光看待它,并且能够快速解决它!我查看了大家的建议并应用它,直到找到解决方案。这是有效的新代码:

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

}

感谢您的所有意见!

【问题讨论】:

  • 鉴于示例,听起来字母之间应该正好有 2 个字符,而不是 3 个?如果age bad 应该是true,删除空格会得到ageb - ge 是 2 个字符,而不是 3 个
  • 问题不是很清楚,如果有aabab。应该是true 还是false
  • 但是对于maple bread,有brea,在ba之间正好有2个字符...

标签: javascript string loops


【解决方案1】:

这里有一个更有效的方法——只需找到字母ab的索引,然后检查两者相减的绝对值是否为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"));

参考资料:

【讨论】:

  • 这非常有帮助!我改用 .lastIndexOf 但仍然有相同的概念。我应该考虑减去索引以获得两者之间的计数。
  • @JennilTee 如果它解决了您的问题,请考虑accepting :)
【解决方案2】:

这是另一种方法:这种方法不包括 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'));

【讨论】:

  • challengeOne("a_a___b__b") 失败;不确定是否可以。
  • 谢谢,由于测试用例不需要空格,所以我使用了替换方法。
【解决方案3】:

你可以递归:

  1. 检查字符串是否以'a'开头并以'b'结尾并检查长度
  2. 继续向左或向右(或两者)剪切字符串,直到中间有 3 个字符或字符串为空。

例子:

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")}
`)

【讨论】:

    【解决方案4】:

    我假设空格 被计算在内,您的示例似乎表明了这一点,尽管您的问题另有说明。如果是这样,这是一个应该有帮助的推动。你是对的,有一些用于字符串的 JavaScript 方法,包括一个可以帮助你在给定字符串中找到 a 和 b 的索引(位置)的方法。

    在这里试试: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#instance_methods

    【讨论】:

    • 由于 OP 只要求向正确的方向推动,因此我没有给出实际的代码示例来回答。希望我这样做没有违反 Stack Overflow 礼仪!
    • 谢谢你!这实际上帮助我找到了我正在寻找的东西。我正在使用 .indexOf 但它会显示初始字符的索引,因此即使字符串 'abcde agub' 为真,它也会为假。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多