【问题标题】:Showing unique characters in a string only once仅在字符串中显示唯一字符一次
【发布时间】:2012-12-01 19:50:27
【问题描述】:

我有一个包含重复字母的字符串。我希望多次重复的字母只显示一次。例如我有一个字符串aaabbbccc 我希望结果是abc。到目前为止,我的功能是这样的:

  • 如果字母不重复,则不显示
  • 如果重复一次,则只显示一次(即 aa 显示 a)
  • 如果重复两次,则显示全部(即 aaa 显示 aaa)
  • 如果重复 3 次,则显示 6(如果 aaaa,则显示 aaaaaa)
function unique_char(string) {
    var unique = '';
    var count = 0;
    for (var i = 0; i < string.length; i++) {
        for (var j = i+1; j < string.length; j++) {
            if (string[i] == string[j]) {
                count++;
                unique += string[i];
            }
        }
    }
    return unique;
}

document.write(unique_char('aaabbbccc'));

函数必须在循环内有循环;这就是为什么第二个for 在第一个里面。

【问题讨论】:

  • 在正则表达式中你可以写'aaabbbccc'.replace(/(.)\1+/g, "$1")
  • unique_char('abracadabra') 的结果应该是什么?
  • 结果应该是 abrcd
  • @ZlatkoSoleniq:那是怎么回事?与您的描述不符。顺便说一句,这个(或者是作业)的用例是什么?

标签: javascript string character unique


【解决方案1】:
let unique=myArray.filter((item,index,array)=>array.indexOf(item)===index)

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
【解决方案2】:

如果你想在数组中返回值,你可以使用下面的函数。

    const getUniqueChar=(str)=>str.split('').filter((item, index, arr)=> 
    arr.slice(index+1).indexOf(item)===-1);

    console.log(getUniqueChar("aaabbbccc"));

你可以使用 Set 构造函数

    cosnt getUniqueChar=(str)=>
    new Set(str.split(''));
    console.log(getUniqueChar('aaabbbccc'));

【讨论】:

    【解决方案3】:
    const countUnique = (s1, s2) => new Set(s1 + s2).size
    

    基于@le_m 答案的更短方式

    【讨论】:

      【解决方案4】:

      这是实现该功能的最简单的函数。 2

      const showUniqChars = (text) => {
        let uniqChars = "";
      
        for (const char of text) {
          if (!uniqChars.includes(char))
            uniqChars += char;
        }
        return uniqChars;
      };
      

      【讨论】:

        【解决方案5】:

        单行解决方案是使用 Set。 const chars = [...new Set(s.split(''))];

        【讨论】:

          【解决方案6】:

          可能为时已晚,但我对这篇文章的回答仍然是我的版本:

          function extractUniqCharacters(str){
              var temp = {};
              for(var oindex=0;oindex<str.length;oindex++){
                  temp[str.charAt(oindex)] = 0; //Assign any value
              }
              return Object.keys(temp).join("");
          }
          

          【讨论】:

            【解决方案7】:

            这是最简单的功能

              function remove(text) 
                {
                  var unique= "";
                  for(var i = 0; i < text.length; i++)
                  {
                    if(unique.indexOf(text.charAt(i)) < 0) 
                    {
                      unique += text.charAt(i);
                    }
                  }
                  return unique;
                }
            

            【讨论】:

              【解决方案8】:

              <script>
                  uniqueString = "";
              
                  alert("Displays the number of a specific character in user entered string and then finds the number of unique characters:");
              
                  function countChar(testString, lookFor) {
                      var charCounter = 0;
                      document.write("Looking at this string:<br>");
              
                      for (pos = 0; pos < testString.length; pos++) {
                          if (testString.charAt(pos) == lookFor) {
                              charCounter += 1;
                              document.write("<B>" + lookFor + "</B>");
                          } else
                              document.write(testString.charAt(pos));
                      }
                      document.write("<br><br>");
                      return charCounter;
                  }
              
                  function findNumberOfUniqueChar(testString) {
                      var numChar = 0,
                          uniqueChar = 0;
                      for (pos = 0; pos < testString.length; pos++) {
                          var newLookFor = "";
                          for (pos2 = 0; pos2 <= pos; pos2++) {
                              if (testString.charAt(pos) == testString.charAt(pos2)) {
                                  numChar += 1;
                              }
                          }
                          if (numChar == 1) {
                              uniqueChar += 1;
                              uniqueString = uniqueString + " " + testString.charAt(pos)
                          }
                          numChar = 0;
                      }
                      return uniqueChar;
                  }
              
                  var testString = prompt("Give me a string of characters to check", "");
                  var lookFor = "startvalue";
                  while (lookFor.length > 1) {
                      if (lookFor != "startvalue")
                          alert("Please select only one character");
                      lookFor = prompt(testString + "\n\nWhat should character should I look for?", "");
                  }
                  document.write("I found " + countChar(testString, lookFor) + " of the<b> " + lookFor + "</B> character");
                  document.write("<br><br>I counted the following " + findNumberOfUniqueChar(testString) + " unique character(s):");
                  document.write("<br>" + uniqueString)
              </script>

              【讨论】:

              • 您能否提供代码的简要说明以及为什么这是解决方案?
              【解决方案9】:

              如果重复字符必须显示一次,请尝试此操作,即 对于 i/p:aaabbbccc o/p:abc

              var str="aaabbbccc";
              Array.prototype.map.call(str, 
                (obj,i)=>{
                  if(str.indexOf(obj,i+1)==-1 ){
                   return obj;
                  }
                }
              ).join("");
              //output: "abc"
              

              如果只需要显示唯一字符(字符串轰炸算法),请尝试此操作,添加另一个“和”条件以删除多次出现的字符并仅显示唯一字符,即 对于 i/p:aabbbkaha o/p:kh

              var str="aabbbkaha";
              Array.prototype.map.call(str, 
               (obj,i)=>{
                 if(str.indexOf(obj,i+1)==-1 && str.lastIndexOf(obj,i-1)==-1){ // another and condition
                   return obj;
                 }
               }
              ).join("");
              //output: "kh"
              

              【讨论】:

                【解决方案10】:

                用字符填充Set 并连接其唯一条目:

                function makeUnique(str) {
                  return String.prototype.concat(...new Set(str))
                }
                
                console.log(makeUnique('abc'));    // "abc"
                console.log(makeUnique('abcabc')); // "abc"

                【讨论】:

                • 必须将原型放在字符串函数路径中才能使其工作。很酷! String.prototype.concat(...new Set(str))
                【解决方案11】:

                使用lodash

                _.uniq('aaabbbccc').join(''); // gives 'abc'
                

                【讨论】:

                  【解决方案12】:

                  先将其转换为数组,然后使用答案here,然后重新加入,如下所示:

                  var nonUnique = "ababdefegg";
                  var unique = nonUnique.split('').filter(function(item, i, ar){ return ar.indexOf(item) === i; }).join('');
                  

                  全部在一行:-)

                  【讨论】:

                    【解决方案13】:

                    您可以将regular expressioncustom replacement function 一起使用:

                    function unique_char(string) {
                        return string.replace(/(.)\1*/g, function(sequence, char) {
                             if (sequence.length == 1) // if the letter doesn't repeat
                                 return ""; // its not shown
                             if (sequence.length == 2) // if its repeated once
                                 return char; // its show only once (if aa shows a)
                             if (sequence.length == 3) // if its repeated twice
                                 return sequence; // shows all(if aaa shows aaa)
                             if (sequence.length == 4) // if its repeated 3 times
                                 return Array(7).join(char); // it shows 6( if aaaa shows aaaaaa)
                             // else ???
                             return sequence;
                        });
                    }
                    

                    【讨论】:

                      【解决方案14】:

                      您的问题是每次在string 中找到该字符时,您都会添加到unique。真的,您可能应该这样做(因为您指定答案必须是嵌套的 for 循环):

                      function unique_char(string){
                      
                          var str_length=string.length;
                          var unique='';
                      
                          for(var i=0; i<str_length; i++){
                      
                              var foundIt = false;
                              for(var j=0; j<unique.length; j++){
                      
                                  if(string[i]==unique[j]){
                      
                                      foundIt = true;
                                      break;
                                  }
                      
                              }
                      
                              if(!foundIt){
                                  unique+=string[i];
                              }
                      
                          }
                      
                         return unique;
                      }
                      
                      document.write( unique_char('aaabbbccc'))
                      

                      在此我们仅将在string 中找到的字符添加到unique(如果它尚不存在)。这根本不是一种有效的方法......但根据您的要求,它应该可以工作。

                      我无法运行它,因为我没有任何方便的东西可以在其中运行 JavaScript ...但是这种方法中的理论应该有效。

                      【讨论】:

                      • 他没有使用 C#。它的 JavaScript。
                      • 我的评论仍然有些有效......我没有任何方便的东西来运行 JavaScript。而且我认为我没有使用任何真正依赖于语言的东西。
                      • 大部分 -- 这行会失败:bool foundIt = false;应该是var foundIt = false;
                      • 它适用于 var 但我有一个问题是什么 (!foundIT) 并且可以用不同的方式编写它
                      • 这只是说如果我们没有在unique 字符串中找到该字符,那么我们需要添加它,因为这是我们第一次遇到这个特殊字符。
                      【解决方案15】:

                      根据实际问题:“如果字母不重复,则未显示”

                      function unique_char(str)
                      {
                          var obj = new Object();
                      
                          for (var i = 0; i < str.length; i++)
                          {
                              var chr = str[i];
                              if (chr in obj)
                              {
                                  obj[chr] += 1;
                              }
                              else
                              {
                                  obj[chr] = 1;
                              }
                          }
                      
                          var multiples = [];
                          for (key in obj)
                          {
                              // Remove this test if you just want unique chars
                              // But still keep the multiples.push(key)
                              if (obj[key] > 1)
                              {
                                  multiples.push(key);
                              }
                          }
                      
                          return multiples.join("");
                      }
                      
                      var str = "aaabbbccc";
                      document.write(unique_char(str));
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-12-03
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-10-10
                        • 1970-01-01
                        相关资源
                        最近更新 更多