2017-02-01 2 views
1

Я пытаюсь проверить, содержит ли два целых числа один и тот же набор цифр.Тот же набор цифр между двумя целыми числами Javascript

equivalent(123, 321) // -> true 
equivalent(413, 1453) // -> false 
equivalent(2002, 2200) // -> true 
equivalent(542, 545) // -> false 

Я начал отключать эту функцию с:

function equivalent(a,b) { 
    let stringA = a.toString().match(/[1-9]/g); 
    let stringB = b.toString().match(/[1-9]/g); 
} 

я не знаю, нужно ли использовать хэш-карту, чтобы отобразить каждое вхождение цифры и увеличивают вперед, однако я не мог проверьте, совпадают ли два объекта друг с другом.


Какой метод наиболее оптимален (с точки зрения пространственно-временной сложности) и какой метод является наиболее легко читаемым или и тем, и другим? Благодарю.


Редактировать: Извините, но не уточнил мой вопрос. Я хочу проверить, содержат ли два целых числа одинаковые цифры и одинаковое количество этих цифр.

+1

бы '.ToString(). Length' быть проще? – j08691

+0

Если я правильно понимаю, кроме одинаковой длины, цифры в них также должны быть одинаковыми, верно? –

+0

Если он всегда будет положительным целым числом (т. Е. Просто цифрами, запятыми, десятичными точками или отрицательными знаками), предложение @ j08691 - это путь. – talemyn

ответ

2

Используйте простой цикл и удалите каждый символ из второй строки с помощью String#replace, а позже проверьте, что вторая строка пуста (пустой означает, что оба содержат одинаковое количество цифр).

console.log(
 
    equivalent(123, 321), // -> true 
 
    equivalent(413, 1453), // -> false 
 
    equivalent(2002, 2200) // -> true 
 
); 
 

 
function equivalent(a, b) { 
 
    // convert into string 
 
    a = a.toString(); 
 
    b = b.toString(); 
 
    // iterate over each character 
 
    for (var i = 0; i < a.length; i++) 
 
    // replace each character from second string 
 
    b = b.replace(a[i], ''); 
 
    // finally check second string is empty 
 
    return b == ''; 
 
}

+0

Сравнение производительности: http://jsperf.com/compare-for-sort –

0

Преобразование в строку, разбить его, разбирайтесь, объединить его и сравнить.

function equivalent(a, b) { 
 
    return a.toString().split("").sort().join("") === b.toString().split("").sort().join(""); 
 
} 
 

 
console.log(equivalent(123, 321)); 
 
console.log(equivalent(413, 1453)); 
 
console.log(equivalent(2002, 2200));

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

1

Вы можете отсортировать фигуры и сравнить объединенные струны.

function equivalent(a, b) { 
 
    return [...a.toString()].sort().join('') === [...b.toString()].sort().join(''); 
 
} 
 

 
console.log(equivalent(123, 321)); 
 
console.log(equivalent(413, 1453)); 
 
console.log(equivalent(2002, 2200));

подход с хэш-таблицу

function equivalent(a, b) { 
 
    var hash = Object.create(null);   
 
    [...a.toString()].forEach(a => hash[a] = (hash[a] || 0) + 1); 
 
    [...b.toString()].forEach(b => hash[b] = (hash[b] || 0) - 1); 
 
    return Object.keys(hash).every(k => !hash[k]); 
 
} 
 

 
console.log(equivalent(123, 321)); 
 
console.log(equivalent(413, 1453)); 
 
console.log(equivalent(2002, 2200));

+0

@PranavCBalan, почему вы так думаете? –

+0

вопрос содержит 'let', так что это вопрос ES6. –

+0

Что такое оператор рассылки '...' в вашем методе? Благодарю. – kdizzle

Смежные вопросы