Microsoft JavaScript任务



朋友们,美好的一天!

我向您介绍了向Microsoft的Online Assessment 2019中的参与者提出的三项JS作业

。Microsoft的Online Assessment是为开发人员准备的初步选择。通过预选的人将被邀请参加在线采访。我在网络上发现的信息表明,恰好将一个小时分配给解决问题的方法,但这并不准确。

我建议您熟悉这些问题并尝试自己解决。欢迎提供详细评论。

非常感谢您解决了Matt Clark

所以走吧

任务编号1


编写一个满足以下条件的解决方案函数:

  • 该函数采用由N个英文字母组成的字符串S
  • 该函数返回的字符串连续不包含三个相同的字母
  • 函数从字符串S中删除最小字母数

例子:

  1. S =“ eedaaad”,该函数返回“ eedaad”。一个字母“ a”被删除。
  2. S =“ xxxtxxx”,函数返回“ xxtxx”。同一字母可以连续出现三遍,但不能连续出现三遍。
  3. S =“ uuuuxaaaaxuuu”,函数返回“ uuxaaxuu”。

假设:

  • N是[1..200,000]范围内的整数
  • S仅包含小写字母[az]

决定:
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


编写一个满足以下条件的解决方案函数:

  • 该函数采用由N个整数组成的数组A
  • 该函数返回两个数字的最大和,其数字加起来等于相同的数量
  • 如果数组中没有此类数字,则函数返回-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”)。

编写一个满足以下条件的解决方案函数:

  • 该函数采用指定的字符串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   
    -   
*/


感谢您的关注。

编码愉快!

All Articles