华为OD笔试前端

密码检测输入(100分)

题目描述

给定用户密码输入流 input,输入流中字符 '<' 表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。

密码安全要求如下:

  1. 密码长度 ≥ 8;
  2. 密码至少需要包含 1 个大写字母;
  3. 密码至少需要包含 1 个小写字母;
  4. 密码至少需要包含 1 个数字;
  5. 密码至少需要包含 1 个字母和数字以外的非空白特殊字符;

注意空串退格后仍然为空串,且用户输入的字符串不包含 '<' 字符和空白字符。

输入描述

用一行字符串表示输入的用户数据,输入的字符串中 '<' 字符标识退格,用户输入的字符串不包含空白字符,例如:

ABC<c89%000<

输出描述

输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由 ',' 分隔, 例如:

ABc89%00,true

用例1

输入

ABC<c89%000<

输出

ABc89%00,true

说明

多余的C和0由于退格被去除,最终用户输入的密码为ABc89%00,且满足密码安全要求,输出true

答案

function test(str) {
  const strArr = str.split("");
  const stack = [];
  strArr.forEach((item) => {
    if (item === "<") {
      stack.pop();
    } else {
      stack.push(item);
    }
  });
  const password = stack.join("");
  // 这里正则不是很会,就分开来写了
  const reg1 = /[A-Z]/.test(password);
  const reg2 = /[a-z]/.test(password);
  const reg3 = /\d/.test(password);
  const reg4 = /[^\w\s]/.test(password);
  const valid = reg1 && reg2 && reg3 && reg4 && password.length >= 8;
  return [password, valid];
}

console.log(test("ABC<c89%000<"))

用例通过率100%

机场航班调度(100分)

XX市机场停放了多架飞机,每架飞机都有自己的航班号CA3385,CZ6678,SC6508等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息。

但是XX市机场只有一条起飞跑道,调度人员需要安排目前停留在机场的航班有序起飞。

为保障航班的有序起飞,调度员首先按照航空公司的缩写(航班号前2个字母)对所有航班进行排序,同一航空公司的航班再按照航班号的后4个数字进行排序,最终获得安排好的航班的起飞顺序。

请编写一段代码根据输入的航班号信息帮助调度员输出航班的起飞顺序。

说明:

航空公司缩写排序按照从特殊符号$ & *,0~9,A~Z排序;

输入描述

第一行输入航班信息,多个航班号之间用逗号 "," 分隔,输入的航班号不超过100个。

例如:

CA3385,CZ6678,SC6508,DU7523,HK4456,MK0987

备注:

航班号为6为长度,后4位位纯数字,不考虑存在后4位重复的场景。

输出描述

CA3385,CZ6678,DU7523,HK4456,MK0987,SC6508

用例1

输入

CA3385,CZ6678,SC6508,DU7523,HK4456,MK0987

输出

CA3385,CZ6678,DU7523,HK4456,MK0987,SC6508

说明

输入为目前停留在该机场的航班号,输出为按照调度排序后输出的有序的航班号

用例2

输入

MU1087,CA9908,3U0045,FM1703

输出

3U0045,CA9908,FM1703,MU1087

答案

function test(arr) {
  function splitItem(str) {
    return [str.slice(0, 2), str.slice(2)];
  }
  return arr.sort((a, b) => {
    const [aStr, aNum] = splitItem(a);
    const [bStr, bNum] = splitItem(b);
    if (aStr === bStr) {
      return Number(aNum) - Number(bNum);
    } else {
      return aStr.localeCompare(bStr);
    }
  });
}
console.log(test(["CA3385", "CZ6678", "SC6508", "DU7523", "HK4456", "MK0987"]));

用例通过率91%

简易内存池(200分)

题目描述

请实现一个简易内存池,根据请求命令完成内存分配和释放。

内存池支持两种操作命令,REQUEST和RELEASE,其格式为:

REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输出error。

RELEASE=释放的内存首地址 表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。

注意:

内存池总大小为100字节。

内存池地址分配必须是连续内存,并优先从低地址分配。

内存释放后可被再次分配,已释放的内存在空闲时不能被二次释放。

不会释放已申请的内存块的中间地址。

释放操作只是针对首地址所对应的单个内存块进行操作,不会影响其它内存块。

输入描述

首行为整数 N , 表示操作命令的个数,取值范围:0 < N <= 100。

接下来的N行, 每行将给出一个操作命令,操作命令和参数之间用 “=”分割。

输出描述

请求分配指定大小内存时,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输出error

释放掉之前分配的内存时,释放成功无需输出,如果释放不存在的首地址则输出error。

用例1

输入

2
REQUEST=10
REQUEST=20

输出

0
10

用例2

输入

5
REQUEST=10
REQUEST=20
RELEASE=0
REQUEST=20
REQUEST=10

输出

0
10
30
0

说明

第一条指令,申请地址0~9的10个字节内存,返回首地址0

第二条指令,申请地址10~29的20字节内存,返回首地址10

第三条指令,释放首地址为0的内存申请,0~9地址内存被释放,变为空闲,释放成功,无需输出

第四条指令,申请20字节内存,09地址内存连续空间不足20字节,往后查找到3049地址,返回首地址30

第五条指令,申请10字节,0~9地址内存空间足够,返回首地址0

答案

class Pool {
  static REQUEST = "REQUEST";
  static RELEASE = "RELEASE";
  static MAX = 100;
  constructor([num, ...params]) {
    //console.log(num, params);
    this.num = num;
    this.actions = params;
    this.map = new Map();
  }
  test() {
    for (let i = 0; i < this.num; i++) {
      const [action, value] = this.actions[i].split("=");
      if (action.indexOf(Pool.REQUEST) !== -1) {
        if (value > Pool.MAX || value <= 0) {
          console.log("error");
          return;
        }
        this.request(Number(value));
      } else if (action.indexOf(Pool.RELEASE) !== -1) {
        this.remove(Number(value));
      } else {
        console.log("error");
      }
    }
  }
  request(value) {
    const zero = 0;
    let left = 0;
    if (!this.map.size) {
      this.map.set(zero, value);
      console.log(left);
    } else {
      //答题的时候写的是这一行,后面发现有bug,当map里面加东西时headList会改变,所以这里结构深拷贝一下。
      //并且keys排序一下,不然会存在前面内存还未使用就直接用后面内存的情况
      //const headList = this.map.keys() 当时这一行代码 测试用例通过55%
      const headList = [...this.map.keys()].sort((a, b) => a - b);
      for (let mapKey of headList) {
        if (mapKey - left >= value) {
          this.map.set(left, left + value);
        } else {
          left = this.map.get(mapKey);
        }
      }
      if (Pool.MAX - left >= value) {
        this.map.set(left, left + value);
        console.log(left);
      } else {
        console.log(-1);
      }
    }
  }
  remove(value) {
    this.map.delete(value);
  }
}

const testArr = [
  5,
  "REQUEST=10", //0
  "REQUEST=20", //10
  "RELEASE=0", //
  "REQUEST=20", //30
  "REQUEST=10", //0
];

const pool = new Pool(testArr);
pool.test();

这是后期笔试结束后自己改的,答题的时候用例通过55%,纯属运气好哈哈哈哈,不知道最后这个代码有多少通过率,大家可以帮忙试下。

全部评论

相关推荐

点赞 6 评论
分享
牛客网
牛客企业服务