算法题

56 阅读4分钟
// 1. 数组扁平化
arr.reduce((pre, cur) =>     
    pre.contact(Array.isArray(cur)
    ? deepFlatten(cur)
    : cur))

arr.flat(Infinity)

// 2. 喊7的次数重排
条件:打乱顺序的每个人喊”过”的次数
结果:还原成正确的顺序
如: 0 1 0
预期: 1 0 0
/*
* 分析 0 1 0 三个人:[0, 0, 0] 一个过
* 开始喊
* 第一轮1 2 3 => [0, 0, 0]
* 第二轮4 5 6 => [0, 0, 0]
* 第三轮'过' 8 9 => [1, 0, 0] 
* 得到一个过停止循环,组装结果返回
*/
如: 0 0 0 2 1
预期: 0 2 0 1 0
/*
* 分析 0 0 0 2 1 五个人:[0, 0, 0, 0, 0] 三个过
* 开始喊
* 第一轮1 2 3 4 5=> [0, 0, 0, 0, 0]
* 第二轮6 '过' 8 9 10 => [0, 1, 0, 0, 0]
* 第三轮11 12 13 '过' 15 => [0, 1, 0, 1, 0]
* 第四轮16 '过' 18 19 20 => [0, 2, 0, 1, 0]
* 得到三个过停止循环,组装结果返回
*/
参与人数
记录次数的数组
满足条件:7的倍数以及含有7的数字
终止条件: 几个过
function getSum(str) {
    return str.split(' ').reduce((prev, next) => {
        return Number(prev) + Number(next)
    })
}
function rightSort(str) {
    const len = str.length; // 参与人数
    const record = new Array(len).fill(0); // 记录次数的数组
    const sum = getSum(str); // 几个过
    let count = 0; // 组成终止条件
    let i = 0; //喊数
    while(count < sum) { // 终止条件
        i++;
        // 满足条件
        if (i % 7 === 0 || String(i).includes('7')) {
            count++;
            const n = i % len;
            record[n - 1]++;
        }
    }
    return record.join(' ');
}

// 最长子字符串的长度
如:字符串s,首位相连成一个环形,在环中找出‘o’字符出现了偶数次最长子字符串的长度。
如:  alolobo  
输出:  6  
如:  looxdolx  
输出:  7

// 没看懂题。。。


// 字符统计及重排
给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及  
其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。  
输入描述:  
输入一行,为一个仅包含字母的字符串。  
输出描述:  
按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;字母和次数间用英文冒号分隔。  
示例1:  
输入  
xyxyXX  
输出  
x:2;y:2;X:2;
function reSort(s) {
    let result = '';
    const map = {};
    for (let i = 0; i < s.length; i++) { 
        if (map[s[i]]) {
            map[s[i]]++;
        } else { 
            map[s[i]] = 1;
        }
    }
    for (const key in map) { 
        result += `${key}:${map[key]};`; 
    }
    return result;
}
console.log(reSort('xyxyXX')); 
// 数组拼接
现在有多组整数数组,需要把它们合并成一个新的数组。合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删掉,如果改行不足固定长度或已经为空,则直接取出剩余部分内容放到新的数组中,继续下一行。
输入:
3
2
2,5,6,7,9,5,7
1,7,4,3,4
输出:
2,5,6,1,7,4,7,9,5,3,4,7
// 按索引范围翻转文章片段
输入一个英文文章片段,翻转指定区间的单词顺序,标点符号和普通字母一样处理,例如输入字符串'I am a developer.',区间[0,3],则输出'developer. a am I'
输入:
I am a developer.
1
2
输出:
I am a developer.
// 猜数字
一个人设定一组四码的数字作为谜底,另一个人猜。
每猜一个数,出数者就要根据这个数字给出提示,提示以XAYB形式呈现,直到猜中为止。
其中X表示位置正确的数的个数(数字正确且位置正确),而Y表示数字正确而位置不对的数的个数。
例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B。
例如,当谜底为5637,而猜谜者才4931时,出题者必须提示1A0B。
当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。
输入:
6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B
输出:
3585