华为嵌入式软件与通用软件类的笔试题是同一题库出的题
题型:3道编程题
答案在底部
题目1:
1、码流等分
有一段2进制数据码流n,请将数据切分成3段,每一段得到相同的2进制值;
如:输入为1010010,可以切分为1010010 3段,都表示10进制中的2如果无法做到,则输出-1,如果输入码流全部为0,视作无法做到,输出-1;
解答要求
时间限制:C/C++ 10ms,其他语言:20ms
内存限制:C/C++64MB,其他语言:128MB
输入
一串字符串,内部都为0和1的字符,最小长度为3个字节,最大长度为50000个字节
输出
切分后的3段2进制数据
样例1
输入:100101000001001010000100101
输出:100101 00000100101 0000100101
解释:切分后的3段都为十进制的37
样例2
输入:1001010001010010100001011010
输出:-1
解释:
样例3
输入:0000111101000111110100010001111010001
输出:00001111010001 1111010001 0001111010001
解释:切分后的3段都为十进制的977
题目2:
2、薪酬统计
某公司拥有N名员工,HR按照职级由低到高(假设不存在职级相同)导出整个公司的人员薪酬数组L,当出现低职级员工薪酬>高职级员工薪酬*2时需要调整低职级员工薪资,调整工作由统计完成之后再进行。现在请计算出整个公司需要调整的总数。
N<= 5000
0<L<2^31
解答要求
时间限制:C/C++1000ms.其他语言:2000ms
内存限制:C/C++256MB,其他语言:512MB
输入
输入第一行是数组长度N,第二行是长度为N的整数数组,每个元素代表员工薪酬,数组按照职级从低到高的顺序排列
输出
一个整数,表示整个公司需要调整的总数
样例1
输入:
5
[1,3,2,3,1]
输出:
2
解释:输入有5个员工,员工的薪酬分别为1.3.2.3.1。职级从低到高,数组索引为1的员工薪酬为3,索引为4的员工薪酬为1,3>1*2,所以需要调整第—次。索引为3的员工薪酬为3。索引为4的员工薪酬为1,需要调整第二次。
题目3:
3、佩奇和乔治能量豆大PK
有一个盒子存放若干个能量豆,每块能量豆都有对应的能量值,能量值都是正整数,用数组energyBeans表示,其中energyBeans[0]表示第i块能量豆的能量值。佩奇和乔治两兄弟每轮PK都是随机从盒子各取出一块能量豆进行PK。假如每轮PK,佩奇每次取出的能量豆的能量值为x,乔治每次取出的能量豆的能量值为y。那么PK结果如下:
如果x==y,那么两块能量豆的能量值被完全中和消失;
如果x!=y,则PK结果产生新的能量豆的能量值z为x与y的差值的绝对值(z= abs(x-y)).然后把能量值为z能量豆放回到能量盒中;
经过多轮PK,最后盒子中最多只会剩下一块能量豆。返回此能量豆的最小可能能量值。如果没有能量豆剩下,就返回0。
解答要求
时间限制:C/C++1000ms,其他语言:2000ms
内存限制:C/C++ 256MB,其他语言:512MB
输入
输入是2行;
第一行能量豆个数n,1<=n <=10*3;
第二行是能量豆的能量值,1<= energyBeans[]<=1000;
输出
输出盒子中剩余最后一块能量豆的能量值,如果没有能量豆剩下,就输出0
样例1
输入:
6
2 7 4 1 8 1
输出:
1
解释:先选出7和8,得到1转换后数组为12.4.1.1.1].
再选出2和4,得到2,转接后数组为[2.1.1.1].
接着是2和1,得到1,转换后数组为[1-1.1].
最后选出1和1,得到0,最终数粗转换为1为最后剩下能量豆的能量值。
样例2
输入:
2
20 5
输出:
15
解释:选出20和5。得到15,转换后数组为15,
#include<bits/stdc++.h>
using namespace std;
vector<int> threeEqualParts(vector<int>& arr) {
int cntOne=accumulate(arr.begin(),arr.end(),0); //从头加起来
if(cntOne%3!=0)return {-1,-1}; //1的个数是否为3等分
if(cntOne==0)return {-1,-1}; //如果全是0
cntOne/=3; //一组有几个1,例如1010010 就是1
int beg1=0,beg2=0,beg3=0;
int curOneCnt=0;
for(int i=0;i<arr