Как стать автором
Обновить

Решение нескольких задач от Microsoft на примере JavaScript

Время на прочтение4 мин
Количество просмотров14K


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

Представляю вашему вниманию три задания по 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);
    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
*/


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


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

Счастливого кодинга!
Теги:
Хабы:
+15
Комментарии18

Публикации

Истории

Работа

Ближайшие события