华为2019暑期实习笔试题
生活随笔
收集整理的這篇文章主要介紹了
华为2019暑期实习笔试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 第一題
- 題意
- 思路
- 代碼
- 第二題
- 題意
- 思路
- 代碼
- 第三題
- 題意
- 思路
- 代碼
? ? ? ?筆試共有3道編程題,分別為100分、200分、300分,兩個小時。以下內容的編寫全憑記憶和個人理解,如有什么不對的地方,希望大家見諒。
第一題
題意
? ? ? ?給出一個字符串,由許多子串組成,每個子串長度都是9,如果子串的第一位是0,就將該子串反序輸出,如果子串的第一位是1,就將該子串正序輸出。
思路
? ? ? ?沒啥說的,簽到題,暴力就ok,可是我代碼寫的太丑了。。。
代碼
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<string> #include<map> #include<queue> #include<stack>using namespace std;char s[500];int main() {int n;while(scanf("%d",&n)!=EOF){scanf("%s",s);int len = strlen(s);s[len]='1';len++;int start = 1;int end = 1;int rev = 0;int flag = 0;int str_num = 0;for(int i=0;i<len;){if(s[i] == '0'){if(flag == 0){rev = 1;flag = 1;start = i+1;i=i+9;}else{flag = 0;end = i-1;if(str_num == 0)str_num = 1;elseprintf(" ");if(rev == 1){for(int j = end; j>=start; --j)printf("%c",s[j]);}else{for(int j = start; j<=end; ++j)printf("%c",s[j]);}}}else if(s[i] == '1'){if(flag == 0){rev = 0;flag = 1;start = i+1;i=i+9;}else{flag = 0;end = i-1;if(str_num == 0)str_num = 1;elseprintf(" ");if(rev == 1){for(int j = end; j>=start; --j)printf("%c",s[j]);}else{for(int j = start; j<=end; ++j)printf("%c",s[j]);}}}else++i;}printf("\n");}return 0; }第二題
題意
? ? ? ?一個蜜蜂,最開始在原點,要去五個其他位置采蜜,求采完回到原點的最短路徑。
思路
? ? ? ?我寫了一個特別丑的暴力,真的不能再丑了。覺得寫一個全排列或者搜索能好看一點。需要注意的是最后輸出的時候,要把答案減0.5,因為.0lf會四舍五入,而題中要求截斷小數部分。
代碼
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<string> #include<map> #include<queue> #include<stack>using namespace std;double x[10],y[10]; double edge[10][10];double calc_dis(double x1,double y1,double x2,double y2) {double tmp1 = (x1-x2)*(x1-x2);double tmp2 = (y1-y2)*(y1-y2);return sqrt(tmp1+tmp2); }int main() {while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2],&x[3],&y[3],&x[4],&y[4],&x[5],&y[5])!=EOF){x[0]=y[0]=0;for(int i=0;i<=5;++i)for(int j=0;j<=5;++j)edge[i][j]=edge[j][i]=calc_dis(x[i],y[i],x[j],y[j]);double ans = 99999999999;for(int i=1; i<=5; ++i)for(int j=1; j<=5; ++j)for(int k=1; k<=5; ++k)for(int l=1; l<=5; ++l)for(int p=1; p<=5; ++p){if(i==j || i==k || i==l || i==p ||j==k || j==l || j==p ||k==l || k==p ||l==p)continue;double tmp = edge[0][i] + edge[i][j] + edge[j][k] + edge[k][l] + edge[l][p] +edge[0][p];ans = min(ans, tmp);}printf("%.0lf\n",ans-0.5);}return 0; }第三題
題意
? ? ? ?有個網格,在某些格子上有水果,我們可以橫、豎、對角(2種)切水果,問最少幾刀可以把水果切沒。
思路
? ? ? ?我覺得是搜索,然后寫啊寫,到最后結束了知道’\\\'是續行符,我有一行代碼由于自己寫了注釋,咋都運行不了,我都蒙了。我的搜索太丑了,可以再優雅點,有些地方也能記憶化一下,我也不知道會不會TLE,會不會WA,1個半小時都在調試。。。
代碼
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<string> #include<map> #include<queue> #include<stack>using namespace std;int x[60],y[60]; int vis[60];int vis_num; int max_n=40; int max_m=50; int n; int end_ans;int calc_cut(int start, int style) {printf("start:%d %d style=%d\n",x[start],y[start],style);int ans=0;if(style == 1){for(int i=1;i<=n;++i)if(x[i]==x[start] && vis[i]==0)ans++;}if(style == 2){for(int i=1;i<=n;++i)if(y[i]==y[start] && vis[i]==0)ans++;}if(style == 3){for(int i=1;i<=n;++i){if((x[i]-x[start])==(y[i]-y[start]) && vis[i]==0){ans++;//printf("i=%d %d %d\n",i,x[i],y[i]);}}}if(style == 4){//cout<<"---------"<<endl;for(int i=1;i<=n;++i)if((x[i]-x[start])==(y[start]-y[i]) && vis[i]==0){ans++;//printf("i=%d %d %d\n",i,x[i],y[i]);}}return ans; }int cut[10]; void dfs(int start, int vis_num, int cut_times) {if(vis_num >= n)return ;printf("----------------------------\n");cut[1] = calc_cut(start,1);// ---cut[2] = calc_cut(start,2);// |||cut[3] = calc_cut(start,3);// \\\cut[4] = calc_cut(start,4);// int max_cut=cut[1];int max_i=1;for(int i=1;i<=4;++i)if(cut[i]>max_cut){max_cut=cut[i];max_i=i;}//printf("start=%d max_cut=%d cut_i=%d cut_times=%d vis_num=%d\n",start,max_cut,max_i,cut_times,vis_num);//printf("%d %d %d %d\n\n\n",cut[1],cut[2],cut[3],cut[4]);//printf("%d\n",max_i);if(max_i == 1){int next;for(int i=1;i<=n;++i)if(x[i]==x[start] && vis[i]==0){vis[i]=1;vis_num++;}elsenext=i;if(vis_num == n)end_ans = min(end_ans, cut_times);elsedfs(next, vis_num, cut_times+1);}if(max_i == 2){int next;for(int i=1;i<=n;++i)if(y[i]==y[start] && vis[i]==0){vis[i]=1;vis_num++;}elsenext=i;if(vis_num == n)end_ans = min(end_ans, cut_times);elsedfs(next, vis_num, cut_times+1);}if(max_i == 3){int next;for(int i=1;i<=n;++i)if((x[i]-x[start])==(y[i]-y[start]) && vis[i]==0){vis[i]=1;vis_num++;}elsenext=i;if(vis_num == n)end_ans = min(end_ans, cut_times);elsedfs(next, vis_num, cut_times+1);}if(max_i == 4){//printf("--------------------\n");int next;for(int i=1;i<=n;++i)if((x[i]-x[start])==(y[start]-y[i]) && vis[i]==0){vis[i]=1;vis_num++;}elsenext=i;if(vis_num == n)end_ans = min(end_ans, cut_times);elsedfs(next, vis_num, cut_times+1);}return ; }int main() {while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);memset(vis,0,sizeof(vis));end_ans=1234567890;dfs(1, 0, 1);printf("%d\n", end_ans);}return 0; }總結
以上是生活随笔為你收集整理的华为2019暑期实习笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字节跳动2019暑期实习生算法岗笔试题
- 下一篇: 百度2019暑期实习计算机视觉岗位笔试题