华为OD机试题B卷【20230606】

面试题一(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 代表指令

  1. c == 0 代表 a 和 b 在一个团队内

  2. c == 1 代表需要判定 a 和 b 的关系,如果 a 和 b 是一个团队,输出一行’we are a
    team’,如果不是,输出一行’we are not a team’

  3. 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)

输出描述

  1. c ==1,根据 a 和 b 是否在一个团队中输出一行字符串,在一个团队中输出‘we are a team‘,不在一个团队中输出’we are not a team’
  2. c 为其他值,或当前行 a 或 b 的标号小于 1 或者大于 n 时,输出字符串‘da pian zi‘
  3. 如果第一行 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;
    }
    }
}

总结:

编码工具:牛客网在线输入输出

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值