Tâches Microsoft JavaScript



Bonjour mes amis!

Je vous présente trois missions JS proposées aux participants à l'évaluation en ligne de

Microsoft 2019. L'évaluation en ligne de Microsoft est une sélection préliminaire de candidats pour les développeurs. Ceux qui ont réussi la sélection préliminaire sont invités à un entretien en ligne. J'ai trouvé sur le réseau des informations indiquant qu'une heure exactement était allouée à la résolution des problèmes, mais ce n'est pas exact.

Je vous suggère de vous familiariser avec les questions et d'essayer de les résoudre vous-même. Les commentaires détaillés sont les bienvenus.

Merci beaucoup d'avoir résolu Matt Clark .

Alors allons-y.

Numéro de tâche 1


Écrivez une fonction de solution qui remplit les conditions suivantes:

  • la fonction prend une chaîne S composée de N lettres de l'alphabet anglais
  • la fonction renvoie une chaîne qui ne contient pas trois lettres identiques dans une rangée
  • la fonction supprime le nombre minimum de lettres de la chaîne S

Exemples:

  1. S = "eedaaad", la fonction renvoie "eedaad". Une lettre «a» est supprimée.
  2. S = "xxxtxxx", la fonction renvoie "xxtxx". Les mêmes lettres peuvent apparaître sur une ligne plus de trois fois, mais pas sur une ligne.
  3. S = "uuuuxaaaaxuuu", la fonction renvoie "uuxaaxuu".

Hypothèses:

  • N est un entier dans la plage [1..200,000]
  • S se compose uniquement de lettres minuscules [az]

Décision:
function solution(input) {
    let result = input.slice(0, 2);
    for (let i = 2; i < input.length; i++) {
        if (input[i] !== input[i - 1] || input[i] !== input[i - 2]) {
            result += input[i];
        }
    }
    console.log(result);
    return result;
}
solution('eedaaad'); // eedaad
solution('xxxtxxx'); // xxtxx
solution('uuuuxaaaaxuuu'); // uuxaaxuu

/*
:
-   result,       
-     :
    -           ,    result
    -      ,   ,   
-  result
*/


Numéro de tâche 2


Écrivez une fonction de solution qui remplit les conditions suivantes:

  • la fonction prend un tableau A composé de N entiers
  • la fonction renvoie la somme maximale de deux nombres dont les chiffres ajoutés ajoutent le même montant
  • s'il n'y a pas de tels nombres dans le tableau, la fonction renvoie -1

Exemples:

  1. A = [51, 71, 17, 42], la fonction renvoie 93. Voici deux paires de nombres dont les chiffres additionnent les mêmes sommes: (51, 42) et (17, 71). La somme de la première paire (la plus grande) est de 93.
  2. A = [42, 33, 60], la fonction renvoie 102. L'ajout des chiffres de tous les nombres du tableau donne le même montant. 42 + 60 = 102.
  3. A = [51, 32, 43], la fonction renvoie -1, car l'ajout des chiffres de tous les nombres donne des montants différents.

Hypothèses:

  • N est un entier dans la plage [1..200,000]
  • Chaque élément du tableau A est un entier dans la plage [1..1,000,000,000]

Décision:
function sumDigits(num) {
    return String(num).split('').reduce(add);
}

function add(a, b) {
    return Number(a) + Number(b);
}

function descending(a, b) {
    if (a > b) {
        return -1;
    } else if (a < b) {
        return 1;
    } else {
        return 0;
    }
}

function extractHighestTwo(arr) {
    return arr.sort(descending).slice(0, 2);
}

function solution(arr) {
    let sums = {};

    arr.forEach(function(num) {
        sum = sumDigits(num);
        if (sums[sum]) {
            sums[sum].push(num);
        } else {
            sums[sum] = [num];
        }
    });

    result = Object.values(sums)
        .filter(nums => nums.length >= 2)
        .map(extractHighestTwo)
        .map(nums => nums.reduce(add))
        .sort(descending)[0];

    console.log(result || -1);
    return result || -1;
}
solution([51, 71, 17, 42]); // 93
solution([42, 33, 60]); // 102
solution([51, 32, 43]); // -1

/*
:
-   
-    
    -     
    -        :
        -         ,  
    -        :
        -    ,  ,  ,    
-      (   "",      )
-  ,    
-   ,    ,   ,  
-       
-           -1,     
*/

/*
   :
function solution(arr) {
    let sums = {};

    arr.forEach(num => {
        sum = String(num).split('').reduce((a, b) => Number(a) + Number(b));
        
        sums[sum] ? sums[sum].push(num) : sums[sum] = [num];
    });

    result = Object.values(sums)
        .filter(nums => nums.length >= 2)
        .map(nums => nums.sort((a, b) => b - a).slice(0, 2))
        .map(nums => nums.reduce((a, b) => a + b))
        [0]

    console.log(result || -1);
    return result || -1;
}
solution([51, 71, 17, 42]); // 93
solution([42, 33, 60]); // 102
solution([51, 32, 43]); // -1
*/


Numéro de tâche 3


Étant donné la chaîne S, composée de N lettres "a" et / ou "b". En une seule action, vous pouvez changer n'importe quelle lettre pour l'inverse ("a" à "b" ou "b" à "a").

Écrivez une fonction de solution qui remplit les conditions suivantes:

  • la fonction prend la chaîne spécifiée S
  • la fonction renvoie le nombre d'actions requises pour obtenir une chaîne qui ne contient pas trois lettres identiques dans une rangée

Exemples:

  1. S = "baaaaa", la fonction renvoie 1. Une chaîne qui ne contient pas trois lettres identiques dans une rangée ("baabaa") peut être obtenue en une seule action.
  2. S = "baaabbaabbba", la fonction renvoie 2. En deux actions, vous pouvez obtenir quatre lignes "valides", par exemple, "bbaabbaabbaa".
  3. S = "baabab", la fonction renvoie 0.

Hypothèses:

  • N est un entier dans la plage [0..200,000]
  • la chaîne S ne contient que les lettres «a» et / ou «b»

Décision:
function numberOfMovesForStreak(streak) {
    let length = streak.length - 2;

    while (length % 3 !== 0) {
        length++;
    }

    return length / 3;
}

function solution(input) {
    const streaks = [];
    let temp = '';

    for (let i = 0; i < input.length; i++) {
        if (input[i] === input[i - 1]) {
            temp += input[i];
        } else {
            if (temp.length > 2 && temp.length !== 0) {
                streaks.push(temp);
            }
            temp = input[i];
        }
    }
    if (temp.length > 2) {
        streaks.push(temp);
    }

    console.log(streaks.map(numberOfMovesForStreak).reduce(((a, b) => a + b), 0));
    return streaks.map(numberOfMovesForStreak).reduce(((a, b) => a + b), 0);
}
solution('baaaaa'); // 1
solution('baaabbaabbba'); // 2
solution('baabab'); // 0

/*
 ,      :
   3-5   ,   1 
 6-8   - 2 
 9-11  - 3 
:
-     ,   3     
-  ,   3     ,  
    - ""   :
        -   
        -  2
        -     ,  3
        -   3   
    -   
*/


Merci de votre attention.

Bon codage!

All Articles