【问题标题】:How to detect a pangram如何检测pangram
【发布时间】:2018-11-28 03:31:28
【问题描述】:

pangram 是一个包含字母表中每个字母至少一次的句子。

到目前为止,这是我的代码:

const isPangram = (string) => {
    let alpha = string.toUpperCase().split("");
    for (let beta = 65; beta < 65 + alpha.length; beta++) {
        let gamma = String.fromCharCode(beta);
        if (alpha.includes(gamma)) {
            continue;
        }
        else {
            return false;
        }
    }
    return true;
}

console.log(isPangram("Detect Pangram"));

为什么“检测 Pangram”会返回 true?

【问题讨论】:

  • 我认为你循环中的条件是错误的。 65 是 beta 的起始值,并且已经肯定大于 alpha 的长度。 beta 的范围不应该是 65 到 90('Z')吗?
  • 这里有一个基于正则表达式的两行函数:stackoverflow.com/a/32557405/74757
  • 你的循环应该更像:for (let beta = 65; beta &lt; 91; beta++) {
  • 补充艾米所说的,你的循环应该是从“A”到“Z”,不是吗?不是 65 到字符串的长度?
  • @MarkMeyer 你是对的!我不知何故错过了 for 循环之前的那一行。我的错。

标签: javascript pangram


【解决方案1】:

您可以使用.every 以非常简单的方式进行操作,如下所示。

alphabets = 'abcdefghijklmnopqrstuvwxyz'.split("");

const isPangram = (string) => {
    string = string.toLowerCase();
    return alphabets.every(x => string.includes(x));
}

console.log(isPangram("Detect Pangram"));
console.log(isPangram("abcd efgh ijkl mnop qrst uvwx yz"));

您可以通过以下链接了解更多关于every 的信息。

  1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every
  2. https://www.w3schools.com/jsref/jsref_every.asp

【讨论】:

  • 这是列表中最好的一个,但是我会将 toLowerCase() 移到 every 调用之外,这样就不会每次都对字母表中的每个字母重复。
  • @MattWay 谢谢,这是个好建议。我已经更新了我的代码。
【解决方案2】:

您的方法是遍历字母表并验证目标字符串中是否存在每个字母 a-z。但是,除非输入字符串长度为 26,否则您的条件循环 65 + alpha.length 不会覆盖字母表的大小。从 65 到 91(含)迭代将解决此问题。

这是另一种解决方案,它提取字母字符,将它们放入一个集合并检查集合大小是否为 26。

const isPangram = s => new Set(s.toUpperCase().match(/[A-Z]/g)).size === 26;

[
  "Detect Pangram",
  "abcd efgh ijkl mnop qrst uvwx yz",
  "abcd efgh ijkl mnop qrst uvwx y",
  "bcd efgh ijkl mnop qrst uvwx yz",
  "abcdefghijklmnopqrstuvwxyy",
  "AbCdEfGhIjKlM zYxWvUtSrQpOn",
  "How quickly daft jumping zebras vex."
].forEach(test => console.log(`${isPangram(test)}\t${test}`));

【讨论】:

  • @MattWay 已处理完毕。
【解决方案3】:

您的错误是您一直在运行循环,直到字符串的长度不是 A-Z。

希望这会有所帮助。

const isPangram = (string) => {
  let alpha = string.toUpperCase().split("");
  for (let beta = 65; beta < 91; beta++) {
    let gamma = String.fromCharCode(beta);
    if (alpha.includes(gamma)) {
      continue;
    } else {
      return false;
    }
  }
  return true;
}

console.log(isPangram("Detect Pangram"));
console.log(isPangram("abcd efgh ijkl mnop qrst uvwx yz"));

https://jsfiddle.net/xjys9dat/ - 一个相同的工作示例

【讨论】:

    【解决方案4】:

    正则表达式方法:

    function isPangram(str){
        var regex = /([a-z])(?!.*\1)/gi;
        return (str.match(regex) || []).length === 26;
    }
    
    console.log(isPangram('abcdEfgHijklmnOpqrStuvwxyZ943')); //true
    console.log(isPangram('hello 049 ds')); //false
    

    参考:Javascript Pangram Regex

    【讨论】:

      【解决方案5】:

      另一种方法:

      const alphabets26 = 'abcdefghijklmnopqrstuvwxyz';
      let input = prompt();
      input = input.toLowerCase();
      let icount = 0;
      
      for (let i = 0; i < alphabets26.length; i++) {
        var letter = alphabets26[i];
        if (input.indexOf(letter) > -1)
          icount++;
      }
      
      if (icount == 26)
        alert('All letters found at least once');
      else
        alert('Few letters missing');

      【讨论】:

        【解决方案6】:

        const isPangram = (string) => {
            let alpha = string.toUpperCase().split("");
        
            // corecteded the bounding condition in the loop
            for (let beta = 65; beta < 91; beta++) {
                
                let gamma = String.fromCharCode(beta);
                if (alpha.includes(gamma)) {
                    continue;
                }
                else {
                    return false;
                }
            }
            return true;
        }
        
        console.log(isPangram("Detect Pangram"));
        console.log(isPangram("abcd efgh ijkl mnop qrst uvwx yz"));
        console.log(isPangram("abcd efgh ijkl mnop qrst uvwx y"));
        console.log(isPangram("bcd efgh ijkl mnop qrst uvwx yz"));

        【讨论】:

        • 至少解释一下你的答案
        • 我相信它在代码中的评论中。@HovercraftFullOfEels
        【解决方案7】:

        php中的一个方法是这样的:

        function detect_pangram($input) { 
            $alphabet = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
            $isPangram = false;
            $array = str_split($input);
            foreach ($array as $char) {
            if (ctype_alpha($char)) {
            if (ctype_upper($char)) {
            $char = strtolower($char);
            }
            $key = array_search($char, $alphabet);
            if ($key !== false) {
            unset($alphabet[$key]);
            }
            }
            }
            if (!$alphabet) {
            $isPangram = true;
            }
            return $isPangram;
          }
        

        【讨论】:

          【解决方案8】:

          如果你知道输入的字符串是严格的字母

          const isPangram = sentence => new Set(sentence).size === 26;
          
          console.log(isPangram("Detect Pangram"));
          console.log(isPangram("abcd efgh ijkl mnop qrst uvwx yz"));
          

          【讨论】:

          • 此答案与另一个答案重复
          猜你喜欢
          • 2021-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多