华为

17 阅读4分钟

1、组织架构管理系统 你正在开发一个企业的组织架构管理系统,公司的组织架构被简化表示为一棵二叉树,树的每个节点代表一个员工,树的层级越低则级别越高,高级别作为主管,管辖其子树涉及的所有员工. 每个人有一个唯一的工号,工号以整数值表示,范围是[0,10^9]。 此管理系统需要提供一个统计能力、对任意两名员工,找到他们级别最低的共同主管,返回出的主管管辖的人员个数。 注意: 如果两名员工本身存在上下级关系,共同主管为级别较高的员工。 员工总数<=10^5。 待检索员工的工号一定在给定的二叉树中,且两位员工工号不同。 解答要求 时间限制:C/C++200ms,其他语言:400ms 内存限制:C/C++256MB,其他语言:512MB 输入 第一行为一个整数,表示输入的节点个数。 第二行为一行数字,由空格分割,每个数字表示一颗满二叉树各层从左到右的节点。值为员工工号,-1代表该节点不存在。 例1 2 3 4 -1 5 -1 -1 6可转化为下图的二叉树。 第三行为两个数字,用空格分割,表示待检索的两名员工工号,例如:5 1。 输出 输出级别最低的共同主管管辖的人员总个(不包括自身)。 样例1 复制 输入:12 2 3 5 1 7 6 8 -1 -1 0 4 -1 0 3 复制 输出:4 解释:0和3存在上下级关系,共同主管为3,管辖总人数为4。 样例2 复制输入:9

function TreeNode(val=0, left=null, right=null) {
  this.val = val;
  this.left = left
  this.right = right
}

const rl = require('readline').createInterface({
  input: process.stdin,
})

const iter = rl[Symbol.asyncIterator]()

const readline = async () => (await iter.next()).value

async function main () {
  let num = await readline()
  let arr = (await readline()).split(' ').map(Number)
  let [p1, p2] = (await readline()).split(" ").map(Number);
  const root = buildTree(arr)
  const commonNode = findCommonNode(root, p1, p2)
  console.log(countNode(commonNode));
}
function countNode(root) {
  let count = 0
  function dfs(root) {
    if(!root) return
    count++
    dfs(root.left);
    dfs(root.right);
  }
  dfs(root);
  return count
}

function findCommonNode(root, p1, p2) {
  const p1Node = findNode(root, p1);
  const p2Node = findNode(root, p2);
  if(!p1Node || !p2Node) return null
  function dfs(root, p, q) {
    if(!root) return null
    if(root === p || root === q) return root
    const left = dfs(root.left, p, q)
    const right = dfs(root.right, p, q);
    if (left && right) return root;
    return left || right
  }
  return dfs(root, p1Node, p2Node);
}
function findNode(root, val) {
  if(!root) return null
  if(root.val === val) return root
  return findNode(root.left, val) || findNode(root.right, val);
}
function buildTree(arr) {
  if (!arr.length) return null
  let root = new TreeNode(arr[0])
  let queue = [root]
  let i = 1
  while(i < arr.length) {
    const node = queue.shift()
    if(node) {
      if(arr[i] !== -1) {
        node.left = new TreeNode(arr[i])
        queue.push(node.left)
      }
      i++
      if(arr[i] !== -1) {
        node.right = new TreeNode(arr[i])
        queue.push(node.right)
      }
      i++
    }
  }
    return root;
}
main()

// 12
// 2 3 5 1 7 6 8 -1 -1 0 4 -1 0 3
//0 3

2、奖项设置 部门准备了一批奖品用于举办抽奖活动,奖品的价值为给定的正整数数组values,其中values[i]表示第i个奖品的价值。每位获奖者可以选择不 限个数最大价值limit的奖品组合,获奖者选择奖品的策略为在limit限制内优先选择单价最高的奖品,请计算最少可以设置多少个奖项; 解答要求 时间限制:c/C++1000ms,其他语言:2000ms 内存限制:C/C++256MB,其他语言:512MB 输入 第一行:正整数len,表述奖品价值数组values的长度, 1<=len<=10^4; 第二行:正整数数组values,长度为len,其中values[i]表示第i个奖品的价值,1<=values[]<=10^4; 第三行:正整数limit,表示每个获奖者可以获得的最大奖品价值, 1<=limit<=10^4。 输出 整数,代表本次抽奖活动可以设置最少的奖项数量; 样例1 复制 输入:2 1 2 3 复制 输出:1 解释:获奖者选择价值为1和2的两个奖品,最少可以设置1个奖项 样例2 复制 输入:7 13 4 4 3 3 5 5 12 复制输出:3 解释:获奖者1选取价值为(5,5)的奖品组合,获奖者2选取价值为(4,4,3)、3的奖品组合,因此:最少可以设置3个奖项才能满足所有获奖者的领取诉求

const rl = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
})
const iter = rl[Symbol.asyncIterator]()
let readline = async () => (await iter.next()).value.trim()

const main = async () => {
  const len = parseInt(await readline())
  const values = (await readline()).split(' ').map(Number)
  const limit = parseInt(await readline())

  // 按价值从大到小排序
  values.sort((a, b) => b - a)

  const awards = [] // 每个奖项当前的价值和

  for (let v of values) {
    let placed = false
    for (let i = 0; i < awards.length; i++) {
      if (awards[i] + v <= limit) {
        awards[i] += v
        placed = true
        break
      }
    }
    if (!placed) {
      awards.push(v) // 新开一个奖项
    }
  }

  console.log(awards.length)
}

main()