面试题一(100分):
【数列描述】
有一个数列a[N] (N=60),从a[0]开始,每一项都是一个数字。数列中a[n+1]都是a[n]的描述。其中a[0]=1。
规则如下:
a[0]:1
a[1]:11(含义:其前一项a[0]=1是1个1,即“11”。表示a[0]从左到右,连续出现了1次“1”)
a[2]:21(含义:其前一项a[1]=11,从左到右:是由两个1组成,即“21”。表示a[1]从左到右,连续出现了两次“1”)
a[3]:1211(含义:其前一项a[2]=21,从左到右:是由一个2和一个1组成,即“1211”。表示a[2]从左到右,连续出现了1次“2”,然后又连续出现了1次“1”)
a[4]:111221(含义:其前一项a[3]=1211,从左到右:是由一个1、一个2、两个1组成,即“111221”。表示a[3]从左到右,连续出现了1次“1”,连续出现了1次“2”,连续出现了两次“1”)
请输出这个数列的第n项结果(a[n],0≤n≤59)。
输入描述
数列的第n项(0≤n≤59)
用例
输入:4
输出:11121
let data=4
markNum(data)
function markNum(data){
let content='1'
if(data==0) {//等于0时直接打印content
console.log(content)
return
}
for(let i=1;i<=data;i++){
let next='' //描述
let chars=content.split('')
let last=chars[0]
let count=1 //记录chars中相同字符的个数
for(let j=1;j<chars.length;j++){
if(chars[j]===last){
count++
}else{
next+=count+last
count=1
last=chars[j]
}
}
next +=count+last
content=next
}
console.log(content,"content") // 111221
}
面试题二(100):
【拔河比赛】
1、按照身高优先、体重次优先的方式准备阵容
2、按规定参照对手派出十名对手
输入描述
1、n,m n代表身高,m代表体重
具体的不太记得了。。。
用例输入:
输入:n m
182 70
183 70
184 70
185 70
186 70
180 71
180 73
180 74
180 65
180 66
输出描述
用例输出:
输出:
186 70
185 70
184 70
183 70
182 70
180 74
180 73
180 71
180 66
180 65
面试题三(200):
【we are a team】
总共有 n 个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,
需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中,具体的:
消息构成为 a b c,整数 a、b 分别代表两个人的标号,整数 c 代表指令
-
c == 0 代表 a 和 b 在一个团队内
-
c == 1 代表需要判定 a 和 b 的关系,如果 a 和 b 是一个团队,输出一行’we are a
team’,如果不是,输出一行’we are not a team’ -
c 为其他值,或当前行 a 或 b 超出 1~n 的范围,输出‘da pian zi’
输入描述
第一行包含两个整数 n,m(1<=n,m<100000),分别表示有 n 个人和 m 条消息
随后的 m 行,每行一条消息,消息格式为:a b c(1<=a,b<=n,0<=c<=1)
输出描述
- c ==1,根据 a 和 b 是否在一个团队中输出一行字符串,在一个团队中输出‘we are a team‘,不在一个团队中输出’we are not a team’
- c 为其他值,或当前行 a 或 b 的标号小于 1 或者大于 n 时,输出字符串‘da pian zi‘
- 如果第一行 n 和 m不符合题目要求的范围,输出"NULL"
用例:
输入 | 输入值 |
---|---|
5 7 | |
1 2 0 | |
4 5 0 | |
2 3 0 | |
1 2 1 | |
2 3 1 | |
4 5 1 | |
1 5 1 | |
输出 | 输出值 |
We are a team | |
We are a team | |
We are a team | |
We are not a team |
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
let n, m;
rl.on("line", (line) => {lines.push(line);
if (lines.length === 1) {[n, m] = lines[0].split(" ").map(Number);}
if (m && lines.length === m + 1) {
lines.shift();
const msgs = lines.map((line) => line.split(" ").map(Number));print(msgs, n, m);
lines.length = 0;}
});
function print(msgs, n, m)
{
if (n < 1 || n >= 100000 || m < 1 || m >= 100000) return console.log("Null");
const ufs = new UnionFindSet(n);
msgs.sort(([a1, b1, c1], [a2, b2, c2]) => c1 - c2).forEach((msg) => {const [a, b, c] = msg;
if (a < 1 || a > n || b < 1 || b > n) {
return console.log("da pian zi");
}if (c === 0) {
ufs.union(a, b);
} else if (c === 1) {
const res =ufs.find(a) === ufs.find(b) ? "We are a team" : "We are not a team";console.log(res);} else {
console.log("da pian zi");}});
}
class UnionFindSet {constructor(n) {
this.fa = new Array(n + 1).fill(0).map((_, idx) => idx);
}
find(x) {
if (this.fa[x] !== x) {
this.fa[x] = this.find(this.fa[x]);
return this.fa[x];
}
return x;
}
union(x, y) {
let x_fa = this.find(x);
let y_fa = this.find(y);
if (x_fa !== y_fa) {
this.fa[y_fa] = x_fa;
}
}
}
总结:
编码工具:牛客网在线输入输出