【问题标题】:check that a word is an isogram with pure javascript检查一个单词是否是纯javascript的等值线
【发布时间】:2018-05-02 12:27:49
【问题描述】:

我如何使用函数检查给定单词是否是纯 JavaScript 的等值图。该函数必须返回 true 或 false。

等值线是一个带有重复字符的单词。

我知道这段代码有效,但我需要更好的解决方案。

function isIsogram(word){
    x = false; y = false;
    for(i = 0; i < word.length; i++){
        wordl = word.substring(0,i)
        wordr = word.substring(i)
        x = wordl.includes(word.charAt(i))
        y = wordr.includes(word.charAt(i))
        //console.log(x,wordl,wordr)
    }
    return x&&y
}
isIsogram("thomas");//False
isIsogram("moses"); //True

【问题讨论】:

  • 如果你不介意使用 es6,你可以这样做:isIsogram = x=&gt; x.length == new Set(x.split('')).size

标签: javascript arrays string


【解决方案1】:

从字符串中删除重复的字母,然后检查两个长度。如果相同,则为等值线。

function isIsogram(str){
 return str.split('').filter((item, pos, arr)=> arr.indexOf(item) == pos).length == str.length;
}
console.log(isIsogram('thomas'));
console.log(isIsogram('moses'));

【讨论】:

    【解决方案2】:

    一种方法!

    function isIsogram(str){
      return !str.match(/([a-z]).*\1/i);
    }
    

    【讨论】:

      【解决方案3】:

      这是使用.split().every() 的简单方法:

      let isIsogram = (str) => str.split("").every((c, i) => str.indexOf(c) == i);
                                  
      console.log(isIsogram("thomas"));   /* no repeating letter */
      console.log(isIsogram("moses"));    /* s repeat 2 times */
      console.log(isIsogram("hello"));    /* l repeat 2 times */
      console.log(isIsogram("world"));    /* no repeating letter */
      console.log(isIsogram("a b c"));    /* space character repeat 2 times */

      文档:

      【讨论】:

      • 如何改进以忽略字母大小写?
      • 请您解释一下 (c, i) 变量。我是初学者 JS 编码器,文档有点难以理解
      • @SamuelBruton c=character 和 i=index。该函数拆分字符串,然后检查每个字符及其索引,然后将字符索引与字符串索引匹配。
      【解决方案4】:

      基于 kishea 的回答:

      function isIsogram(sWord)
       {
        for (iCharIndex = 0; iCharIndex < sWord.length; iCharIndex++)
          if (sWord.substring(iCharIndex + 1).includes(sWord.charAt(iCharIndex)))
            return false;
        return true;
       }
      

      如果在当前位置 (substring) 的右侧找到当前位置 (charAt) 的字符 (includes),则返回 false。否则循环运行到最后并返回true

      【讨论】:

        【解决方案5】:
        const isIsogram = (word) => {
            return new Set(word.toLowerCase()).size === word.length
        }
        
        console.log(isIsogram('Thor'));//true
        console.log(isIsogram('Loki'));//true
        console.log(isIsogram('America'));//false
        

        【讨论】:

        • 虽然这段代码可能提供了正确的答案,但简要解释一下它的工作原理对于教授 OP 和社区中的其他人大有帮助。请考虑在此代码中添加解释 sn-p
        【解决方案6】:

        怎么样:

        > function isIsogram(word) {
        ... var a = word.split('')
        ... var b = Array.from(new Set(a))
        ... return a.length === b.length;
        ... }
        undefined
        > isIsogram("mesos")
        false
        > isIsogram("thomas")
        true
        

        或者更好(每个字符只检查一次):

        > function isIsogram2(word) {
        ... for(var i=0,len=word.length-1;i<len;++i) {
        ..... var c = word[i]
        ..... if(word.indexOf(c,i+1) !== -1) return false;
        ..... }
        ... return true;
        ... }
        undefined
        > isIsogram2("mesos")
        false
        > isIsogram2("thomas")
        true
        

        【讨论】:

          【解决方案7】:
          function isIsogram(word){
             return !/(.).*\1|\d/i.test(word)
          }
          

          【讨论】:

            【解决方案8】:
            var str=prompt('Enter a string');
                var strlen=str.length;
            
                for(i=0;i<strlen;i++){
                   var stc=str.charAt(i);
                   var flag=0;
                   for(j=0;j<strlen;j++){
                    var stk=str.charAt(j);
                      if(stc==stk){
                        flag=flag+1;
                      }
                   }
            
                   if(flag!=1){
                    break;
                   }
            
                }
            
                if(flag!=1){
                    alert('It is not an isogram');
                }
                else{
                    alert('It is an isogram');
                }
            

            【讨论】:

              【解决方案9】:

              当给定一个单词时,这个函数 if 将单词分成两部分, 那分别是wordl和wordr。 检查两个拆分以在原始单词中包含一个字符。如果 wordl 和 wordr 都包含原始单词中的任何字符。那么这肯定是一个等值线

              function isIsogram(word){
                  x = false; y = false;
                  for(i = 0; i < word.length; i++){
                      wordl = word.substring(0,i)
                      wordr = word.substring(i)
                      x = wordl.includes(word.charAt(i))
                      y = wordr.includes(word.charAt(i))
                      //console.log(x,wordl,wordr)
                  }
                  return !x&&y
              }
              isIsogram("thomas");//True
              isIsogram("moses"); //False
              

              【讨论】:

              • 首先,这些结果不是倒过来的吗?其次,通过简短解释代码的工作原理可以改进这个答案。
              • 我测试了我得到的结果。只是需要一个更好的解决方案
              • 如果您正在寻找更好的解决方案,那么您的尝试应该是问题的一部分,而不是答案。
              • @kishea An isogram is a word without a repeated character. 然而单词 moses 有两个 s-es 但它被识别为等值线。
              【解决方案10】:

              const isIsogram = (string) => {
                  
                  const lowerCased = string.toLowerCase()
                  
                  const result = lowerCased.split('').every((v,i)=>lowerCased.indexOf(v)===i)
                  
                  return result
              
              }
              
              console.log(isIsogram('ambidExtRously')) // true
              console.log(isIsogram('patteRN')) // false

              【讨论】:

                【解决方案11】:
                function isIsogram(word) {
                
                    let uniqueCharacters = new Set(word.split(''));
                
                    uniqueCharacters = Array.from(uniqueCharacters); //get all the unique char
                
                    let charFreq = {}; //e.g {a:2, b:3}
                
                    for (element of uniqueCharacters) {
                        charFreq[element] = 0;
                    } //set the frequency of each char to zero
                
                    function updateFrequency(element) {
                        charFreq[element] += 1;
                    }//callback used directly below
                
                    word.split('').forEach(updateFrequency); //for each char encountered, update frequency
                
                    let frequencyOfCharacter = [];
                
                    for (keys in charFreq) {
                        frequencyOfCharacter.push(charFreq[keys]);
                    }
                
                    function equal(item) {
                        return item === frequencyOfCharacter[0];
                    }
                    //check if all the frequencies are the same, an isogram means all characters occur at the same frequency
                
                    return frequencyOfCharacter.every(equal);
                }
                
                console.log(isIsogram('try'), isIsogram('baba'), isIsogram('tests'));
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-03-26
                  • 2019-01-06
                  • 2021-12-23
                  • 2013-03-29
                  • 1970-01-01
                  • 2017-10-21
                  • 2012-11-02
                  • 2011-11-08
                  相关资源
                  最近更新 更多