【问题标题】:Return true if none of the letters in the blacklist如果黑名单中没有任何字母,则返回 true
【发布时间】:2020-09-18 06:42:07
【问题描述】:

如果黑名单中没有任何字母,则返回 true 出现在短语中。如果至少一封来自 短语中存在黑名单 return false;

比较应该不区分大小写。意思是 'A' == 'a'。

/**
     * 
     * @param {string} blacklist
     * @param {string} phrase
     * 
     * @returns {boolean}
     */
    function hasNoneLetters(blacklist, phrase) {
      console.log(blacklist)
      var x = phrase.includes(blacklist);
      if(x === false){
        return true
      }
      else{
        return false
      }

    }

【问题讨论】:

  • 我认为如果以字符串形式提供黑名单,则需要将其拆分为数组。将每件事都设为小写或大写以比较值。希望这会有所帮助。

标签: javascript


【解决方案1】:

它不起作用,因为您正在检查一个字符串是否包含在 entirety 中的另一个字符串中。相反,您需要分别获取blacklist 的每个字符并检查它是否存在于phrase 字符串中。

另外,在字符串上使用toLowerCase 进行不区分大小写的比较

function hasNoneLetters(blacklist, phrase) {
  blacklist = blacklist.toLowerCase();
  phrase = phrase.toLowerCase();

  for (const char of blacklist)
    if (phrase.includes(char))
      return false;

  return true
}

console.log(hasNoneLetters('abc', 'This has'))
console.log(hasNoneLetters('XYZ', 'This doesnt'))
console.log(hasNoneLetters('C', 'case insensitive'))

另一种选择是创建黑名单字母的Set。使用Array.from 将字符串字符串转换为字符数组。检查 some 的字母是否包含在集合中。

function hasNoneLetters(blacklist, phrase) {
  const set = new Set(blacklist.toLowerCase());
  return !Array.from(phrase.toLowerCase()).some(c => set.has(c));
}

【讨论】:

  • 谢谢你非常匹配,对不起,我是菜鸟,这对我理解 ES6 来说非常困难
  • 赞成,因为这是迄今为止唯一包含不区分大小写的答案。但是,Turkish case conversion in JavaScript 有一些与此相关的重要信息。
  • @JessicaBulldog 我添加了类似于你的代码的版本
【解决方案2】:

你不是在问问题——你在挣扎什么?

如果您想知道为什么您的函数不起作用,var x = phrase.includes(blacklist); 只会在 整个黑名单出现时返回 true按顺序,在phrase.

【讨论】:

    【解决方案3】:
    /**
     * 
     * @param {string} blacklist
     * @param {string} phrase
     * 
     * @returns {boolean}
     */
    function hasNoneLetters(blacklist, phrase) {
      console.log(blacklist)
      var phrase_parts = phrase.split(" ");
      for(var part of phrase_parts) {
        if (blacklist.includes(part)) {
          return false;
        }
      }
      return true;
    }
    

    【讨论】:

    • 如果没有匹配的字母应该返回true)
    • 修复了它。只需要交换返回值。
    【解决方案4】:

    您需要检查黑名单中的每个字母,而不是一次检查完整的黑名单。

    function hasNoneLetters(blacklist, phrase) {
      let lowerCasePhrase = phrase.toLowerCase();
      for (let letter of blacklist.toLowerCase()) {
        if (lowerCasePhrase.includes(letter)) return false
      }
      return true
    }
    

    此外,您可能希望使用 Set 在其中插入短语的所有字母以优化性能。这将使您的运行时间从 O(N*M) 降低到 O(max(N, M)),其中 N 和 M 是输入的长度。

    【讨论】:

      【解决方案5】:

      最短的一个答案

      function hasNoneLetters(blacklist, phrase) {
          return !blacklist.split('').find(b => phrase.includes(b))
       }
      

          function hasNoneLetters(blacklist, phrase) {
              return !blacklist.split('').find(b => phrase.includes(b))
           }
      
      console.log(hasNoneLetters('Abc', 'the Phrase'))
      
      console.log(hasNoneLetters('Abc', 'the PhrAse'))
      console.log(hasNoneLetters('abc', 'the Phrase'))

      【讨论】:

      • 都是字符串:@param {string} blacklist @param {string} phrase
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2017-02-28
      相关资源
      最近更新 更多