Задачи по JavaScript от Microsoft

—

от автора

Доброго времени суток, друзья!

Представляю вашему вниманию три задания по JS, предложенные участникам Microsoft’s Online Assessment 2019.

Microsoft’s Online Assessment — предварительный отбор кандидатов в разработчики. Тех, кто прошел предварительный отбор, приглашают на онлайн собеседование. Нашел в сети информацию, что на решение задач отводился ровно один час, но это не точно.

Предлагаю вам ознакомиться с вопросами и попробовать решить их самостоятельно. Развернутые комментарии приветствуются.

За решения огромное спасибо Matt Clark.

Итак, поехали.

Задание № 1

Напишите функцию «solution», удовлетворяющую следующим условиям:

  • функция принимает строку S, состоящую из N букв английского алфавита
  • функция возвращает строку, которая не содержит трех одинаковых букв подряд
  • функция удаляет из строки S минимальное количество букв

Примеры:

  1. S = «eedaaad», функция возвращает «eedaad». Одна буква «a» удалена.
  2. S = «xxxtxxx», функция возвращает «xxtxx». Одинаковые буквы могут встречаться в строке более трех раз, но не подряд.
  3. S = «uuuuxaaaaxuuu», функция возвращает «uuxaaxuu».

Допущения:

  • N — целое число в диапазоне [1..200,000]
  • S состоит только из строчных букв [a-z]

Решение:

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 */ 

Задание № 2

Напишите функцию «solution», удовлетворяющую следующим условиям:

  • функция принимает массив A, состоящий из N целых чисел
  • функция возвращает максимальную сумму двух чисел, цифры которых при сложении дают одинаковые суммы
  • если таких чисел в массиве нет, функция возвращает -1

Примеры:

  1. A = [51, 71, 17, 42], функция возвращает 93. Здесь две пары чисел, цифры которых при сложении дают одинаковые суммы: (51, 42) и (17, 71). Сумма первой (наибольшей) пары равняется 93.
  2. A = [42, 33, 60], функция возвращает 102. Сложение цифр всех чисел в массиве дает одинаковые суммы. 42 + 60 = 102.
  3. A = [51, 32, 43], функция возвращает -1, поскольку сложение цифр всех чисел дает разные суммы.

Допущения:

  • N — целое число в диапазоне [1..200,000]
  • Каждый элемент массива A — целое число в диапазоне [1..1,000,000,000]

Решение:

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); } 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 */ 

Задание № 3

Дана строка S, состоящая из N букв «a» и/или «b». За одно действие можно поменять любую букву на противоположную («a» на «b» или «b» на «a»).

Напишите функцию solution, удовлетворяющую следующим условиям:

  • функция принимает указанную строку S
  • функция возвращает количество действий, необходимых для получения строки, которая не содержит трех одинаковых букв подряд

Примеры:

  1. S = «baaaaa», функция возвращает 1. Строку, которая не содержит трех одинаковых букв подряд («baabaa»), можно получить за одно действие.
  2. S = «baaabbaabbba», функция возвращает 2. За два действия можно получить четыре «валидных» строки, например, «bbaabbaabbaa».
  3. S = «baabab», функция возвращает 0.

Допущения:

  • N — целое число в диапазоне [0..200,000]
  • строка S содержит только буквы «a» и/или «b»

Решение:

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 и возвращаем частное     - возвращаем сумму частных */ 

Благодарю за внимание.

Счастливого кодинга!

ссылка на оригинал статьи https://habr.com/ru/post/489452/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *