绿盟软开笔试A卷8.28
题型:单选20 简答4 编程2
编程1 击鼓传花 (100%)
思路:循环队列模拟
注意:返回的是序号,数组中写下的是Nx(某整数)
function fn(arr) {
// N 人数 start 从这个人开始 N1 第一次传几个人 dequeue 所有人在白板上写下的数
let N = arr[0], start = arr[1], N1 = arr[2], dequeue = arr.slice(3).map((item, index) => [item, index+1])
if (N < start) return -1;
for (let i = 0; i < start-1; i++) {
dequeue.push(dequeue.shift());
}
// 人数等于1则停止游戏
while (dequeue.length > 1) {
for (let i = 0; i < N1-1; i++) {
dequeue.push(dequeue.shift());
}
N1 = dequeue.shift()[0];
}
return dequeue[0][1];
} 编程2 字符串旋转 (91%)
思路:字符串分割,翻转,拼接
// str2为子字符串,str1一定包含子字符串,子字符串不旋转,如果含有多个,则匹配第一个
function fn(str1, str2) {
if (str1.length > 200) return;
let index = str1.indexOf(str2);
let left = str1.slice(0, index);
let right = str1.slice(index + str2.length);
// 以下部分可能纯纯想多了,对通过率毫无贡献...
let start = false, end = false;
if (right.indexOf(str2) === 0) {
start = true;
}
if (right.lastIndexOf(str2) === right.length - str2.length) {
end = true;
}
let res1 = swap(left);
let res2 = right.indexOf(str2) === -1 ? swap(right) :right.split(str2).map(item => swap(item)).reverse().join(str2);
res2 = start ? str2 + res2 : res2;
res2 = end ? res2 + str2 : res2;
return res2 + str2 + res1;
}
function swap(s) {
return [...s].reverse().join('');
} 感觉方方面面都考虑到了,但一直通过91%累了...
#绿盟#
