10

文字が繰り返される文字列があります。複数回繰り返される文字を一度だけ表示したい。たとえばaaabbbccc、結果を にしたい文字列がありますabc。これまでのところ、私の関数は次のように機能します:

  • 手紙が繰り返されない場合、それは表示されません
  • 1 回繰り返される場合は、1 回だけ表示されます (つまり、aa は a を表示します)。
  • 2 回繰り返された場合、すべてを表示します (つまり、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'));

関数は with loop 内にある必要があります。そのため、2 番目forは 1 番目の内側にあります。

4

15 に答える 15

30

aSetに文字を入力し、その一意のエントリを連結します。

function makeUnique(str) {
  return String.prototype.concat(...new Set(str))
}

console.log(makeUnique('abc'));    // "abc"
console.log(makeUnique('abcabc')); // "abc"

于 2016-06-20T21:51:14.143 に答える
24

最初に配列に変換してから、ここで答えを使用し、次のように再結合します。

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

すべて1行で:-)

于 2015-03-01T20:09:35.120 に答える
3

遅すぎるかもしれませんが、それでもこの投稿に対する私のバージョンの回答です。

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("");
}
于 2018-07-27T12:38:54.840 に答える
2

カスタム置換関数で正規表現を使用できます。

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;
    });
}
于 2012-12-13T22:20:57.963 に答える
1

実際の質問によると、「手紙が繰り返されない場合は表示されません」

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));
于 2012-12-13T20:52:12.573 に答える
1

あなたの問題はunique、 で文字を見つけるたびにに追加していることですstring。実際には、おそらく次のようなことを行う必要があります (回答はネストされた 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 を実行するのに便利なものがないため、これを実行することはできません ... しかし、このメソッドの理論は機能するはずです。

于 2012-12-13T20:59:04.957 に答える
1

重複する文字を一度表示する必要がある場合、つまり 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"

一意の文字 (String Bombarding Algo) のみを表示する必要がある場合は、これを試してください。別の「and」条件を追加して、複数回出現した文字を削除し、一意の文字のみを表示します。つまり、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"
于 2017-06-17T21:08:31.967 に答える