Fork me on GitHub

笔试编程题0329

前言

2019华为春招实习机试题,ac两道,最后一道80%,找不出原因,本地完全没问题。

题目

Rake接收最大径索引。

在无线通信接收,接收到的信号一般会有RAKE多经。现给出RAKE接收机21径能量;多经索引为0-20;用一个4径的接收窗在21径上进行滑动,滑动窗口判断什么位置接收最大能量。接收窗索引以窗内第一径的索引为准。比如窗最大能量框住径为0,1,2,3;则窗索引为0;如果两个窗的能量一样,则以索引最小为输出。

遍历一边,求出各个能量窗的值,找出最大的的能量窗的索引输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int num;
vector<int> ivec;
while(cin>>num){
ivec.push_back(num);
}
vector<int> result = {0};
int window_sum = 0;
for(int i=0;i<4;++i){
window_sum+=ivec[i];
}
result.push_back(window_sum);
for(int i=4; i<ivec.size();++i){
window_sum = window_sum-ivec[i-4]+ivec[i];
result.push_back(window_sum);
}
int min_index = 0;
int max_value = result[0];
for(int i=1; i<result.size(); ++i){
if(result[i] > max_value){
max_value = result[i];
min_index = i;
}
}
cout << min_index-1 << endl;
return 0;
}

标准键盘与自然键盘映射

输入一个字符串,表示按照标准键盘输入动作,在自然键盘上打字产生的字符串。输出打字人在标准键盘上要打印的实际内容。

比如输入“H kz k xif”,输出”I am a boy”。

标准键盘:"QWERTYUIOPASDFGHJKLZXCVBNM"
自然键盘:"ABCDEFGHIJKLMNOPQRSTUVWXYZ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
char str[256] = {0};
string sta = "QWERTYUIOPASDFGHJKLZXCVBNM";
string nat = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int size = sta.size();
for(int i=0;i<size;++i){
str[nat[i]] = sta[i]; //大写的转换
str[nat[i]+32] = sta[i]+32; //小写的转换
}
string input;
string output = "";
getline(cin,input);
int length = input.size();
for(int i=0;i<length;++i){
if((input[i]>='A'&&input[i]<='Z') || (input[i]>='a'&&input[i]<='z')){
cout<<str[input[i]];
}
else{
cout<<input[i];
}
}
cout<<endl;
return 0;
}

最大连续字数组的和

输入:2,-3,4,11,-5,8,3,-6

输出:21

不知道为啥只通过了80%,先对字符串拆分出各个数字,然后通过动态规划求出最大连续子串和。

f(i) = max(f(i-1)+ivec[i],ivec[i]);
res = max(res,f(i));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
int size = s.size();
int flag = true;
long long num=0;
vector<long long> ivec;
for(int i=0;i<size;++i){
if(s[i]=='-') flag = false; //如果是负数
else if(s[i]=='+') flag = true; //如果是正数
else if(s[i]>='0'&&s[i]<='9') num = num*10+(s[i]-'0');
else if(s[i]==','){ //遇到逗号
num = flag?num:-1*num;
ivec.push_back(num);
flag = true;
num = 0;
}else if(s[i]==' ') continue;
else{ //输入错误
cout<<"输入有误"<<endl;
return 0;
}
}
num = flag?num:(-1)*num;
ivec.push_back(num);
long long maxsubarray = ivec[0]; //先假设最大值为nums[0] 后面依次更新
long long sum = 0;
for(int i=0;i<ivec.size();++i){
sum += ivec[i];
if(sum>maxsubarray) maxsubarray = sum;
if(sum<0) sum = 0;
}
cout<<maxsubarray<<endl;
return 0;
}
-------------本文结束感谢您的阅读-------------

本文地址:http://www.wangxinri.cn/2018/03/29/2019华为春招实习机试题/
转载请注明出处,谢谢!

梦想夹带眼泪,咸咸的汗水!