Uber OA 真题复盘|三题完整思路 + 单调栈 + 区间连续性判断

刚考完 Uber OA,趁热分享一波攒人品!本场一共三道题,整体难度中等偏上:基础扎实、做过同类题型的会很顺;只零散刷题、没总结过套路的很容易卡壳。下面直接上题目 + 核心思路 + 考点,不废话全是干货。


第一题:最小幂次运算次数

题目描述

给定正整数 n,每次操作可以加或减一个 2 的整数次幂(2^i,i≥0)。求把 n 变成 0 所需的最少操作次数

核心思路

本质是二进制 + 连续 1 合并贪心

  • 把 n 转成二进制,观察连续 1 的段:
    • 单个 1:直接加减一次即可 → 1 次
    • 连续 k 个 1:可以用 +1 进位,把连续 1 变成 1 个 1,再减 → 等价 2 次
  • 从低位往高位扫,合并连续 1,统计次数即可。

考点

  • 二进制位运算
  • 贪心思想
  • 边界:n=0、n=1、全 1 串(如 7=111)

第二题:商品最终定价计算(经典单调栈)

题目描述

给定价格数组,每个商品最终价 = 原价 − 右侧第一个 ≤ 它的价格,没有则为原价。要求输出:

  1. 所有商品最终价的总和
  2. 按原价出售的商品 0-based 索引(升序空格分隔)

核心思路

标准「下一个更小 / 等于元素」,单调栈秒解

  • 维护一个从栈底到栈顶单调递增的栈
  • 从右往左遍历,对每个位置找到右侧第一个 ≤ 当前值的数
  • 计算最终价,统计总和
  • 记录没有找到更小值的下标,最后输出

考点

  • 单调栈模板题
  • 下一个更小 / 更大元素
  • 细节:是 ≤ 不是 <,索引输出顺序

第三题:平衡数字判定(区间连续性)

题目描述

给定 1~n 的排列 p。如果存在区间 [l, r],使得区间内数字恰好是 1~k 的排列,则称 k 是平衡数字。对每个 1≤k≤n,判断是否平衡,返回长度为 n 的二进制字符串(第 k 位 1/0)。

核心思路

利用排列的连续性性质

  • 在排列中,一段数字是 1~k 的排列 ⇨
    • 数字恰好包含 1~k
    • max - min + 1 == 长度
  • 记录每个数字出现的位置 pos [x]
  • 对每个 k,维护当前 1~k 的min_pos 和 max_pos
  • 如果 max_pos - min_pos + 1 == k,说明存在这样的区间 → 平衡,记为 1,否则 0

考点

  • 排列性质
  • 区间连续判断
  • 线性维护最值,O (n) 做法

整体难度与备考建议

  • 题量:3 题
  • 难度:中等偏上
  • 高频考点:
    1. 位运算 / 贪心
    2. 单调栈(大厂 OA 重灾区)
    3. 排列 + 区间连续性

很多同学不是不会做,而是:

  • 模板不熟,现场推太慢
  • 时间分配崩
  • 细节写错(索引、边界、符号)

如果你在准备 Uber / TikTok / Microsoft 等大厂 OA,真的建议针对性练真题 + 模板,而不是盲目刷 LeetCode 冷门题。

需要完整代码版答案 + 同类型押题的同学可以留言,我后续再更~祝大家都 OA 稳过,offer 多多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值