今天晚上做了一下华为的春招实习题,对于我这种非Acmer来说,感觉难度不大。。
第一题
忘记题目了。。
代码:
#include<cstdio>
#include <cstring>
int main(){
char str[100];
scanf("%s",str);
int len = strlen(str);
int max = 0;
for (int i = 0; i < len ; i++)
for (int j = len - 1; j > 0; j--) {
if (str[i] == str[j])
if (max < j - i + 1)
max = j - i + 1;
}
printf("%d", max);
return 0;
}
第二题:
输入一串IPV6的地址,输出判断属于哪种网络类型
#include<stdio.h>
int move(int a,int n){
a=a>>n;
return a;
}
int main(){
char str[100]={0};
scanf("%s",str);
int a[8]={0};
int b=0;
b=sscanf(str,"%0x:%0x:%0x:%0x:%0x:%0x:%0x:%0x",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7]);
if(b!=8)
printf("Error\n");
else if((move(a[0],8)&0x00ff)==0x00ff)
printf("Multicast\n");
else if((move(a[0],4)&0x0fec)==0x0fec)
printf("SiteLocal\n");
else if((move(a[0],4)&0x0fe8)==0x0fe8)
printf("LinkLocal\n");
else if((a[0]|a[1]|a[2]|a[3]|a[4]|a[5]|a[6]|a[7])==1)
printf("Loopback\n");
else if((a[0]|a[1]|a[2]|a[3]|a[4]|a[5]|a[6]|a[7])==0)
printf("Unspecified\n");
else printf("GlobalUnicast");
return 0;
}
第三题
dp问题,输入三行,第一行流量,第二行每个应用的消耗流量,第三行每个应用能够得到的金币数。
例如:
输入
40
12 13 23 36
11 11 20 30
输出:1 3
分析:可以发现,题目并没有说n是多少,这是一个坑点,没有类似的经验,栽了跟头,
其实可以通过cin求出来,因为没有考虑相同金币数取排名靠前的,所以此题只过了一半,有待优化解决
#include <stdio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
int n=0;
scanf("%d ",&n);
int a[100]={0};
int b[100]={0};
int i=0;
int max=0;
while(cin>>a[i++],cin.get()!='\n'); //这里就可以将输入的个数求出来
int len=i;
int o=0,k=0;
for(int i=0;i<len;i++)
scanf("%d",b+i);
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(a[i]+a[j]<=40)
if(max<=b[i]+b[j]){
max=b[i]+b[j];
o=i;
k=j;
}
}
}
printf("%d %d",o+1,k+1);
return 0;
}
小结
这次华为的笔试应该不难,只要本科不是特别水,一般都能够AC两道题,唉,看来我也需要再加把劲了。