当前位置: 首页 > news >正文

大厂笔试汇总

大厂笔试

  • 华为笔试汇总
      • 1.交易系统的降级策略(二分法)
      • 2.获取最多食物(树形DP)
      • 3.小王的密码本(哈希)
      • 4.每日股票价格(单调栈)
      • 5.中庸行者(回溯)
      • 输入描述
      • 输出描述
      • 6.数字序列比大小(贪心)
      • 输入描述
      • 输出描述
      • 7、快递中转站
      • 8、互通设备集
  • 字节跳动
  • 中兴笔试

华为笔试汇总

1.交易系统的降级策略(二分法)

题目描述:有一个核心交易系统接口被N个上游系统调用,每个上游系统的调用量R=[R1,R2…,RN].由于核心交易系统集群故障,需要暂时系统降级限制调用,核心交易系统能接受的最大调用量为cnt。设置降级规则如下;如果sum(R1.R2…RN)小于等于cnt,则全部可以正常调用,返回-1;如果sum(R1.R2…RN)大于cnt,设置一个阈值limit,如果某个上游系统发起的调用量超过limit,就将该上游系统的调用量限制为limit,其余未达到limit的系统可以正常发起调用。求出这个最大的limit(limit可以为0)此题目对效率有要求,请选择高效的方式。

输入描述

第一行:每个上游系统的调用量(整型数组) 第二行:核心交易系统的最大调用量 0<R.length<=10^5,0<R[i]<105,0<cnt <= 10^9

输出描述

调用量的阈值Iimit

测试用例

样例1:
输入:
1 4 2 5 5 1 6 
13
输出:
2
解释:因为1+4+2+5+5+1+6>13;将limit设置为2,则1+2+2+2+2+1+2=12<13。所以limit为2样例2:
输入:
1 7 8 8 1 0 2 4 9
7
输出:
0
解释:因为即使limit设置为1,1+1+1+1+1+1+1+1=8>7也不满足,所以limit只能为0

解题思路:二分法,在[0, end]左闭右闭区间内不断搜索符合条件的limit,本题需要搜索到符合条件的最大右边界,即找到ret恰好小于cnt时对应的end边界。这就需要在区间内寻找符合条件的右边界相关算法,在后面已经引入。

#include <iostream>
#include <vector>
using namespace std;int getSum(vector<int>& nums, int limit)
{int sum = 0;for(int num : nums){if(num < limit) sum += num;else sum += limit;}return sum;
}int getLimit(vector<int>& nums, int cnt, int begin, int end)
{// 二分法实现 寻找符合条件的右边界(因为要找到ret恰好小于cnt时对应的边界)int mid = 0;while(begin < end){mid = begin + (end - begin) / 2;int ret = getSum(nums, mid);// 需要缩小左侧边界if(ret < cnt){begin = mid + 1;}// 需要缩小右侧边界else if(ret > cnt){end = mid - 1;}else{// 别返回,收缩右侧边界begin = mid + 1;}}// 返回ret恰好小于cnt时对应的mid,即我们需要的limitreturn end;
}int main() {// vector<int> nums{1,7,8,8,1,0,2,4,9};// int cnt = 7;vector<int> nums{2,4,2,5,5,2,6};int cnt = 1;int sum = 0;int begin = 0;      // 左边界直接从0开始,也避免了选择左侧边界带来的麻烦int end = INT_MIN;  // 记录所有元素中的最大元素 最终形成左闭右闭区间for(int i = 0; i < nums.size(); ++i){end = max(end, nums[i]);sum += nums[i];} if(sum <= cnt) cout << -1 << endl;int limit = getLimit(nums, cnt, begin, end);cout << limit << endl;return 0;
}

在排序数组内搜索左右边界

思路:labuladong

① 搜索一个元素时,搜索区间两端闭;while条件带等号,if相等就返回;mid必须加减一,因为区间两端闭;while结束就凉了,凄凄惨惨返-1。

② 搜索左右边界时,搜索区间要阐明;左闭右开最常见,其余逻辑便自明;while要用小于号,这样才能不漏掉;if相等别返回,利用mid锁边界;mid加一或减一?要看区间开或闭;while结束不算完,因为你还没返回;索引可能出边界,if检查保平安。

将right初始化为nums.size() - 1, while的终止条件为left == right + 1,也就是left > right时循环结束,那么while的循环条件就应该为 <= 。这样就将搜索区间统一成左闭右闭区间。

寻找左侧边界-左闭右闭区间

// 寻找左侧边界-左闭右闭区间
int left = 0, right = nums.size() - 1;
// 搜索区间为[left, right]
while(left <= right)
{int mid = left + (right - left) / 2;if(target > nums[mid]){// 搜索区间变为[mid + 1, right]left = mid + 1;}else if(target < nums[mid]){// 搜索区间变为[left, mid - 1]right = mid - 1;}else if(target == nums[mid]){// 别返回,收缩左侧边界right = mid - 1;}
}
// 循环结束还没有返回值,还需要判断索引是否越界(这里left == right + 1会结束循环)
// 检查出界情况 || (不出界判断是否是target)
if(left >= nums.size() || nums[left] != target)
{return -1;
}
return left;

寻找右侧边界-左闭右闭区间

// 寻找右侧边界-左闭右闭区间
int left = 0, right = nums.size() - 1;
while(left <= right)
{int mid = left + (right - left) / 2;if(target > nums[mid]){// 搜索区间变为[mid + 1, right]left = mid + 1;}else if(target < nums[mid]){// 搜索区间变为[left, mid - 1]right = mid - 1;}else if(target == nums[mid]){// 别返回,收缩右侧边界left = mid + 1;}
}// 循环结束,判断出界情况或者是否是target
if(right < 0 || nums[right] != target)
{return -1;
}
return right;

2.获取最多食物(树形DP)

题目描述:

主办方设计了一个获取食物的游戏。游戏的地图由N个方格组成,每个方格上至多2个传送门,通过传送门可将参与者传送至指定的其它方格。

同时,每个方格上标注了三个数字:

(1) 第一个数字id: 代表方格的编号,从0到N-1,每个方格各不相同

(2) 第二个数字parent-id: 代表从编号为parent-id的方格可以通过传送门传送到当前方格(-1则表示没有任何方格可以通过传送门传送到此方格,这样的方格在地图中有且仅有一个);

(3) 第三个数字value: 取值在[-100,100]的整数值,正整数代表参与者得到相对取值单位的食物,负整数代表失去相应数值单位的食物(参与者可能存在临时持有食物为负数的情况),0则代表无变化。

此外,地图设计时保证了参与者不可能到达相同的方格两次,并且至少有一个方格的value是正整数。 游戏开始后,参与者任意选择一个方格作为出发点,当遇到下列情况之一退出游戏: (1)参与者当前所处的方格无传送门: (2) 参与者在任意方格上主动宣布退出游戏 请计算参与者退出游戏后,最多可以获得多少单位的食物 解答要求 时间限制: C/C++ 1300ms.其他语言:2600ms内存限制: C/C++256MB其他语言:512MB 第一行:方块个数N (N<10000)

测试用例:

输入描述:

第一行:方块个数N

其余行,共N行,每行3个数字

输出描述:

最多可以获得多少单位的食物

样例1:
输入:
7
0 1 8
1 -1 -2
2 1 9
4 0 -2
5 4 3
3 0 -3
6 2 -3
输出:
9
参与者从方格0出发,通过传送门到达方格4,再通过传送门到达方格5。一共获得8+(-2) +3=9个单位食物,得到食物最多: 或者参与者在游戏开始时处于方格2,直接主动宣布退出游戏,也可以获得9个单位食物。样例2:
输入:
3
0 -1 3
1 0 1
2 0 2
输出
5
参与者从方格0出发,通过传送门到达方格2,一共可以获得3+2=5个单位食物,此时得到食物最多
#include <iostream>
#include <vector>
using namespace std;int dfs(vector<vector<int>>& nodes, int n
http://www.lryc.cn/news/186106.html

相关文章:

  • 【数据结构】快排的详细讲解
  • 蓝牙资讯|三星推迟发布智能戒指Galaxy Ring,智能穿戴小型化是大趋势
  • 移动端tree树
  • SpringTask ----定时任务框架 ----苍穹外卖day10
  • Fuzz测试:发现软件隐患和漏洞的秘密武器
  • 无为WiFi的一批服务器
  • SpringBoot3.0——踩坑
  • Springboot的自动装配原理和文件上传FastDFS
  • 【数据库开发】DQL操作和多表设计
  • 用PyTorch轻松实现二分类:逻辑回归入门
  • [nltk_data] Error loading stopwords: <urlopen error [WinError 10054]
  • 基于Spring Boot的网上租贸系统设计与实现(源码+lw+部署文档+讲解等)
  • 通过IP地址管理提升企业网络安全防御
  • termius mac版无需登录注册直接永久使用
  • TPU编程竞赛|Stable Diffusion大模型巅峰对决,第五届全球校园人工智能算法精英赛正式启动!
  • 微信小程序 rpx 转 px
  • 机器学习之旅-从Python 开始
  • 100天精通Python(可视化篇)——第103天:Pyecharts绘制多种炫酷水球图参数说明+代码实战
  • 好用的文件备份软件推荐!
  • 1130 - Host ‘192.168.10.10‘ is not allowed to connect to this MysOL server
  • 如何实现 Es 全文检索、高亮文本略缩处理
  • Netty(四)NIO-优化与源码
  • 我的创业之路:我为什么选择 Angular 作为前端的开发框架?
  • 阿里云服务器ECS是什么?云服务器详细介绍
  • 深入了解快速排序:原理、性能分析与 Java 实现
  • [晕事]今天做了件晕事22;寻找99-sysctl.conf; systemd
  • 2578. 最小和分割
  • Mybatis mapper报错:Class not found: org.jboss.vfs.VFS
  • ARM作业1
  • leetcode 502. IPO