2013-06-24 3 views
4

Имейте массив, настроенный с помощью a[letter][occurences], но изо всех сил пытайтесь пройти через этот массив, чтобы проверить на occurences > 1 и удалить те, которые есть.Javascript: Определите, являются ли все символы в строке уникальными, а если нет, удалите повторяющиеся символы.

function charFreq(s) { 
    var i, j; 
    var a = new Array(); 

    for (j = 0; j < s.length; j++) { 
     for (i = 0; i < a.length; i++) { 
      if (a[i][0] == s[j]) { 
       a[i][1]++; 
       break; 
      } 
     } 
     if (i == a.length) { 
      a[i] = [s[j], 1]; 
     } 
    } 
    return a[i][0]; 
} 
document.write(charFreq("insert string here")); 

Это беспорядок я придумал до сих пор:

function check(str) { 
    var c; 
    for (c=0; c < a.length; c++) { 
     if(a[c][1] == 1) { 
      return true; 
      break; 
     } else { 
      return false; 
     } 
    } 
} 

ответ

1

Не делать это таким образом.

function noDups(s) { 
    var chars = {}, rv = ''; 

    for (var i = 0; i < s.length; ++i) { 
    if (!(s[i] in chars)) { 
     chars[s[i]] = 1; 
     rv += s[i]; 
    } 
    } 

    return rv; 
} 

alert(noDups("Shoe fly pie, and apple pan dowdy")); // Shoe flypi,andw 

Поскольку длина вашей строки становится больше, ваш код становится медленнее с коэффициентом примерно равной площади длины строки.

+0

, если бы я был сделать массив для дублирующихся подсчитываются отдельно, будет ли это быть помещено в заявлении еще? Или я хочу создать новую функцию? – JSNewb

+0

@JSNewb эта функция возвращает новый массив.Он может быть изменен, чтобы также вернуть карту, а карта будет содержать подсчеты. (Его можно было бы преобразовать в массив, если бы вы этого захотели.) – Pointy

0

Для удаления повторяющихся символов из строки, вы можете использовать следующую функцию, которая сделала пользователь @Cerbrus

function find_unique_characters(string){ 
    var unique=''; 
    for(var i=0; i<string.length; i++){ 
     if(string.lastIndexOf(string[i]) == string.indexOf(string[i])){ 
      unique += string[i]; 
     } 
    } 
    return unique; 
} 
console.log(find_unique_characters('baraban')); 

Если вы хотите, чтобы вернуть символы, которые появляются происходят один раз в строки, проверке если их последнее вхождение находится в том же положении, что и , их первое появление.

Ваш код возвращал все символы в строке, по крайней мере один раз, вместо возвращает только символы, которые происходят не чаще одного раза

Ссылка на резьбе StackOverflow Remove duplicate characters from string

+0

Это, вероятно, будет работать, но это также алгоритм 'n^2'. – Pointy

0

Вот быстрый способ:

str = str.split('').filter(function(v,i,self){ 
    return self.indexOf(v) == i; 
}).join(''); 
+0

Ницца, но это только «быстрый» с точки зрения ввода его :-) – Pointy

+0

@Pointy: Yup. Не самый эффективный, я думаю, но в какой момент вы должны действительно волноваться? – elclanrs

+0

Ну, 100-символьная строка похожа на 100 раз медленнее, чем почти линейный алгоритм, который использует карту. Может быть, это не грандиозное дело; зависит от ситуации. – Pointy

0
function RemoveDuplicateLetters(input) { 
    var result = '', i = 0, char = ''; 
    while (i < input.length) { 
     char = input.substring(i, i+1); 
     result += char; 
     input = input.replace(char,''); 
    } 
    return result; 
} 
+0

Вместо * подстроки * рассмотрим [* charAt *] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.4). Кроме того, оператор * + = * медленный в некоторых браузерах, добавление к массиву может быть намного быстрее (и не намного медленнее в других браузерах). – RobG

0

Я не могу видеть сращивания версии, так вот один:

function uniqueChars(s) { 
    var s = s.split(''); 
    var c, chars = {}, i = 0; 

    while ((c = s[i])) { 
    c in chars? s.splice(i, 1) : chars[c] = ++i; 
    } 
    return s.join(''); 
} 
0

Это предполагает только алфавитные символы, а верхний регистр не равен прописными.

function uniqueChars(string){ 
    var i= 0, L= string.length, ustring= '', next; 
    while(i<L){ 
     next= string.charAt(i++); 
     if(ustring.indexOf(next)== -1) ustring+= next; 
    } 
    return ustring.replace(/[^a-zA-Z]/g, ''); 
} 
var s1= 'The quick red fox jumps over the lazy brown dog.'; 
uniqueChars(s1) 

/* Возвращаемое значение: (String) Thequickrdfoxjmpsvtlazybwng */

Это возвращает любой уникальный символьно-

function uniqueArray(array){ 
    return array.filter(function(itm, i, T){ 
     return T.indexOf(itm)== i; 
    }); 
} 
var s1= 'The quick red fox jumps over the lazy brown dog.'; 
uniqueArray(s1.split('')).join(''); 

/* Возвращаемое значение: (String) quickrdfoxjmpsvtlazybwng. */

3

Использование ES6 Set:

// :: unique = Array<any>|string => Array<any> 
 
const unique = xs => [...new Set(xs)] 
 

 
const dedupe = str => unique(str).join('') 
 

 
console.log(
 
    unique('foo'), // => ['f', 'o'] 
 
    dedupe('foo'), // => 'fo' 
 
)

+0

Это именно то, что я искал, простой и легкий «Set» :) – Jacobi