【网易】秋招笔试Js版解答(二)

  1. 字符串碎片
描述

一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。

输入

输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母('a'-'z')

输出

输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。

如样例所示: s = "aaabbaaac"
所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25

示例输入

aaabbaaac

示例输出

2.25

解题分析

水题。字符串的长度除以该字符串中不重复字符的个数,就是所有碎片的平均长度。

代码
let main = s => {
    return (s.length/s.replace(/(.)\1+/g, '$1').length).toFixed(2);
};

注:利用正则表达式去除重复的字符串

4.游历魔法王国

描述

魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。

输入

输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。
第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。

输出

输出一个整数,表示小易最多能游历的城市数量

示例输入

5 2
0 1 2 3

示例输出

3

解题分析

首先要先找到树的最长路径,如果(步数+1)小于最长路径的话,那么可以游历的城市就是(步数+1)。加1的原因是小易本身站一个城市。
如果超过了最长路径的话,那么每多2步,它就能多游历一个城市,可以理解做是在最长路径上的一个分支城市。只有一步是只能过去回不来的。
这里还有一个关键的条件parent[i](0 ≤ parent[i] ≤ i),城市的序号不会出现大序号在前,所以可以很方便的用循环去找出最长路径。

代码
let cityCount = (n, l, parent) => {
    let dp = [];
    let maxDeep = 0;
    dp[0] = 1;
    //找最长路径
    for (let i = 1; i < n; i++) {
        //被联通的城市深度是前一个城市加1
        dp[i] = dp[parent[i - 1]] + 1;
        maxDeep = Math.max(dp[i], maxDeep);
    }
    let count = 0;
    //如果没超过最长链路,是步数+1
    if (maxDeep >= l + 1) {
        count = l + 1;
    } else {
    //超过了最长链路,先计算出剩余步数,多2步就多游历一个城市
        count = parseInt((l + 1 - maxDeep) / 2) + maxDeep;
    }
    //步数太多也不会超过城市个数
    if (count > n) {
        count = n;
    }
    return count;
};
  1. 重排数列
描述

小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。

输入

输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9)

输出

对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。

示例输入

2
3
1 10 100
4
1 2 3 4

示例输出

Yes
No

解题分析

我们设定数串长度为L,数串中可以被4整除的数字个数为a,不可以被4整除且可以被2整除的个数为b。我们假设b个数为0时,想满足条件,当数列长度大于1的时候,a必须要大于等于(int)L/2,比如长度为1,则,如果不满足的话,少一个可以被4整除的数字,则需要两个不可以被4整除且可以被2整除的数字去做补充,如果个数符合,则为Yes,如果不符合则为No。


这里有条件1 ≤ i ≤ N - 1,说明数列长度大于等于2,不考虑数列为1情况

代码
let canResort = (m, arr) => {
    //a为4倍数的个数;b为2倍数的个数
    let a = 0,
        b = 0;
    arr.forEach(function (e) {
        if (e % 4 == 0) {
            ++a;
        } else if (e % 2 == 0) {
            ++b;
        }
    });
    //查看需要几个四倍数
    let need = parseInt(m / 2);
    if (need <= a) {
        //目前提供的多余需要的,则说明可以重排
        return 'Yes';
    } else if (2 * (need - a) <= b) {
        //如果不足,查看2倍数是否可以补足,如果可以则满足
        return 'Yes';
    }
    return 'No';
};

你可能感兴趣的:(【网易】秋招笔试Js版解答(二))