字节跳动2019暑期实习生算法岗笔试题
生活随笔
收集整理的這篇文章主要介紹了
字节跳动2019暑期实习生算法岗笔试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 第一題
- 題意
- 思路
- 代碼
- 第二題
- 題意
- 思路
- 代碼
- 第三題
- 題意
- 思路
- 代碼
- 第四題
- 題意
- 思路
- 代碼
? ? ? ?筆試共有4道編程題,每道題20分,兩個小時。這個題感覺比騰訊的簡單一點。以下內容的編寫全憑記憶和個人理解,如有什么不對的地方,希望大家見諒。
第一題
題意
? ? ? ?有一個人用一張1024元的紙幣購買價值n元的商品,賣家用四種硬幣找零,分別是1、4、16、64,問賣家找零最少需要多少個硬幣。
思路
? ? ? ?將硬幣面值從小到大排序,計算即可。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int main() {int n ;while(scanf("%d",&n)!=EOF){int rec = 1024 - n;int num64 = rec / 64;rec = rec - 64*num64;int num16 = rec / 16;rec = rec - 16*num16;int num4 = rec / 4;rec = rec - 4*num4;int num1 = rec / 1;rec = rec - 1*num1;printf("%d\n",num64+num16+num4+num1);}return 0; }第二題
題意
? ? ? ?有一個程序員寫了個自動處理字符串的代碼,規則有兩條:①如果有aabb型子串,改為aab;②如果有ccc型子串,改為cc。讓我們復現程序員的代碼。
思路
? ? ? ?模擬題,我的思路是將字符串中不符合規則的位置用字符’@'代替,最后輸出的時候忽略這些位置即可。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;char s[8000000];int main() {int t;scanf("%d",&t);while(t--){scanf("%s",s);int len = strlen(s);for(int i = 0 ; i < len; ){int next1 = i+1;while(s[next1] == '@' && next1<len)++next1;int next2 = next1+1;while(s[next2] == '@' && next2<len)++next2;int next3 = next2+1;while(s[next3] == '@' && next3<len)++next3;if(s[i]==s[next1] && s[next1]==s[next2]){s[i] = '@';i = i+1;continue;}else if(s[i]==s[next1] && s[next2]==s[next3]){s[next2] = '@';continue;}else{i = i+1;continue;}}for(int i=0;i<len;++i)if(s[i]!='@')printf("%c",s[i]);printf("\n");}return 0; }第三題
題意
? ? ? ?老師要給一群學生根據他們的成績發獎品,學生們圍在一個圓桌周圍,每個人都有自己的成績。發獎品的規則是:①每個學生都至少有一個獎品;②如果某學生比左右鄰座的學生成績好,那他應收到比他們更多的獎品。問:老師至少需要準備多少個獎品。
思路
? ? ? ?按照成績從小到大排序,依次發獎品即可。這里用到了結構體排序。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int num[100000+10];struct TMP {int num,ll,rr,rec;int pos; }tmp[100000+10],org[100000+10];int cmp(TMP a, TMP b) {return a.num < b.num; }int main() {int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=0;i<n;++i){scanf("%d",&tmp[i].num);if(i == 0){tmp[i].ll=n-1;tmp[i].rr=1;}else if(i == n-1){tmp[i].ll=n-2;tmp[i].rr=0;}else{tmp[i].ll=i-1;tmp[i].rr=i+1;}tmp[i].rec=1;tmp[i].pos=i;org[i].rec = tmp[i].rec;org[i].ll = tmp[i].ll;org[i].rr = tmp[i].rr;org[i].num = tmp[i].num;}sort(tmp, tmp+n, cmp); // for(int i=0; i<n; ++i) // printf("%d %d %d %d %d\n",tmp[i].pos, tmp[i].num, tmp[i].ll, tmp[i].rr, tmp[i].rec);for(int i=0; i<n; ++i){int pos = tmp[i].pos;int should_rec = org[pos].rec;if(org[pos].num > org[org[pos].ll].num)should_rec = max(should_rec, org[org[pos].ll].rec+1);if(org[pos].num > org[org[pos].rr].num)should_rec = max(should_rec, org[org[pos].rr].rec+1);org[pos].rec = should_rec;//printf("%d %d %d %d %d\n",org_pos, tmp[i].num, tmp[i].ll, tmp[i].rr, tmp[i].rec);}int ans = 0;for(int i=0; i<n; ++i){//printf("%d ",org[i].rec);ans += org[i].rec;}printf("%d\n",ans);}return 0; }第四題
題意
? ? ? ?有n根繩子,給出每根的長度。現在要求從這n根繩子中剪出m根等長的繩子(注:不能拼接),問等長繩子最長多長。
思路
? ? ? ?等長繩子最短為0,最長肯定不超過n根繩子中最長的繩子長度,所以將左端點設置為0,右短點設置為最長繩長,二分+判斷,就可以了。需要注意二分的終止條件那里,精度不能設置的太高,否則會WA,設置成題意中的0.01即可,或者0.001。
代碼
#include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<string>using namespace std;int num[100000+10]; int n,m;int _check(double _need) {int ans = 0;for(int i=n;i>=1;--i){double tmp = num[i]*1.0;ans = ans + (tmp/_need);}if(ans >= m)return 1;elsereturn 0; }int main() {while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=n;++i)scanf("%d",&num[i]);sort(num+1,num+1+n);double ll = 0;double rr = num[n];while((rr-ll) > 0.001){double mm = (ll+rr)/2;if(_check(mm))ll = mm;elserr = mm;}printf("%.2f\n", ll);}return 0; }總結
以上是生活随笔為你收集整理的字节跳动2019暑期实习生算法岗笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯2019暑期实习生提前批CV岗笔试题
- 下一篇: 华为2019暑期实习笔试题