Вернуть true, если строка в первом элементе массива содержит все буквы строки во втором элементе массива - PullRequest
0 голосов
/ 19 мая 2018

Мой код работает, за исключением того, что мутация ([«Мэри», «Армия»]) должна возвращать значение «истина», но она возвращает ложь, а мутация ([«Мэри», «Тревога»])) должна возвращать значение «истина», но этовозвращает false.

Может кто-нибудь объяснить, почему это происходит?

Мой код пока

function mutation(arr) {
    a=arr.slice(0,1); var a_str  = a.toString();  a_arr  =  Array.from(a_str);  
    b=arr.slice(1,2); var b_str  = b.toString();  b_arr  =  Array.from(b_str);
    var  flag=0; 

    for(var  i=0;i<b_arr.length;i++){  
        for(var  j=0;j<a_arr.length;j++){
            if(b_arr[i]==a_arr[j]){
                flag+=1;
            }
        }
    }

    if(flag>=b_arr.length){
        return  true;
    } else  return  false;
}

console.log(mutation(["Mary", "Aarmy"]));

Ответы [ 4 ]

0 голосов
/ 19 мая 2018

Вы можете сделать это действительно просто, если вы используете Set.Например:

const mutation = arr => {
  var a = new Set(arr[0].toLowerCase())
  var b = new Set(arr[1].toLowerCase())
  return [...a].every(ch => b.has(ch))  
}

console.log(mutation(["Mary", "Army"]))
console.log(mutation(["Mary", "Aarmy"]))
console.log(mutation(["Mary", "Aary"]))
console.log(mutation(["ab", "abba"]))
console.log(mutation(["voodoo", "no"]))

Я все еще чувствую, что в этом вопросе есть некоторая неоднозначность, но если требуется точность, вы также можете просто проверить, что размеры набора равны (поскольку они содержат все уникальныебуквы)

0 голосов
/ 19 мая 2018

Вам нужно использовать toLowerCase() для сравнения каждого символа с учетом регистра.И вы можете дополнительно удалить дополнительный внутренний цикл и сделать что-то вроде этого:

function mutation(checkArray){
  var firstElement = checkArray[0];
  var secondElement = checkArray[1];
  var splitSecondElement = secondElement.split('');
  var matched = true;
  for(var i=0; i<splitSecondElement.length; i++){
    var firstElementLower = firstElement.toLowerCase();
    var characterLower = splitSecondElement[i].toLowerCase();
    if(firstElementLower.indexOf(characterLower) === -1){
      matched = false;
      break;
    }
  }
  return matched;
}

console.log(mutation(["Mary", "Army"]));
console.log(mutation(["Mary", "Aarmy"]));
console.log(mutation(["Mary", "Aarmyxyz"]));
0 голосов
/ 19 мая 2018

Проблема:

Проблема с вашим кодом в том, что JavaScript равен case-sensitive, а ваш код этого не ожидает, поэтому вот что вы можете сделать:

Решение:

если оба равны в этом случае:

, тогда вы можете сделать проверку анаграммы:

anagram = _ => _.toLowerCase().split('').sort().join('').trim();

const isAnagram = _ => anagram(_[0]) === anagram(_[1])

В противном случае вы можете сделать что-то подобное:

check = a => !a[0].split ``.map(_ => _[X = `toLowerCase`]()).filter(_ => !a[1].includes(_[X]())).length

console.log(check(['Mary','Aarmy']))
0 голосов
/ 19 мая 2018

Для этого можно использовать функции map, filter и toLowerCase.

Пример:

function mutation(arr){ 
    return !arr[0].split("")
    .map(x => x.toLowerCase())
    .filter(l => !arr[1].includes(l.toLowerCase())).length
}

var res = mutation(["Mary", "Aarmy"]);

console.log(res); //true
...