[C语言]字节跳动2019春招研发部分编程题
1、萬萬沒想到之聰明的編輯
題目描述:
我叫王大錘,是一家出版社的編輯。我負責校對投稿來的英文稿件,這份工作非常煩人,因為每天都要去修正無數(shù)的拼寫錯誤。但是,優(yōu)秀的人總能在平凡的工作中發(fā)現(xiàn)真理。我發(fā)現(xiàn)一個發(fā)現(xiàn)拼寫錯誤的捷徑:
(1)三個同樣的字母連在一起,一定是拼寫錯誤,去掉一個的就好啦:比如 helllo -> hello
(2)兩對一樣的字母(AABB型)連在一起,一定是拼寫錯誤,去掉第二對的一個字母就好啦:比如 helloo -> hello
(3)上面的規(guī)則優(yōu)先“從左到右”匹配,即如果是AABBCC,雖然AABB和BBCC都是錯誤拼寫,應(yīng)該優(yōu)先考慮修復(fù)AABB,結(jié)果為AABCC
我特喵是個天才!我在藍翔學(xué)過挖掘機和程序設(shè)計,按照這個原理寫了一個自動校對器,工作效率從此起飛。用不了多久,我就會出任CEO,當上董事長,迎娶白富美,走上人生巔峰,想想都有點小激動呢!
……
萬萬沒想到,我被開除了,臨走時老板對我說: “做人做事要兢兢業(yè)業(yè)、勤勤懇懇、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我現(xiàn)在整個人紅紅火火恍恍惚惚的……
請聽題:請實現(xiàn)大錘的自動校對程序
輸入描述:
第一行包括一個數(shù)字N,表示本次用例包括多少個待校驗的字符串。后面跟隨N行,每行為一個待校驗的字符串。輸出描述:
N行,每行包括一個被修復(fù)后的字符串。輸入例子1:
2 helloo wooooooow輸出例子1:
hello woow分析
? 本題主要考察對字符串的操作,因為數(shù)據(jù)量不大,可以直接暴力法解題。主要要找到的兩個特征字符子串的形式應(yīng)該為AAA和AABB,對于AAA型的子串我們可以去掉第一個A那個位置的字符即可,AABB型的子串我們則需要去掉第一個B那個位置的字符,且優(yōu)先“從左到右”匹配,以上操作可以通過字符串遍歷的形式完成修改。在實際代碼中,為了避免頻繁對數(shù)組數(shù)據(jù)進行移動,我選擇了使用‘0’來替換掉需要刪去的字符來進行標記,具體實現(xiàn)代碼如下:
代碼
#include<stdio.h> #include<string.h> int main() {int n,i;scanf("%d",&n); //待校驗的字符串數(shù)量char str[1005];while(n--){int frist = 1,second = 0; scanf("%s",str);for(i=1;i<strlen(str);i++){if(str[i] == str[i-1] && frist < 3 && second == 0){frist ++;//滿足AAA形式,去掉第一個Aif(frist == 3){str[i-2] = '0';frist = 2;}}else if(str[i] != str[i-1] && frist > 1 && second == 0 ){second = 1;}else if(str[i] == str[i-1] && frist > 1 && second != 0){//滿足AABB形式,去掉第一個Bstr[i-1] = '0';second = 1; }else{frist = 1;second = 0; }}for(i=0;i<strlen(str);i++){//輸出沒被替換(去掉)的字符if(str[i]!='0')printf("%c",str[i]);}printf("\n");}return 0;}2、萬萬沒想到之抓捕孔連順
題目描述
我叫王大錘,是一名特工。我剛剛接到任務(wù):在字節(jié)跳動大街進行埋伏,抓捕恐怖分子孔連順。和我一起行動的還有另外兩名特工,我提議
(1) 我們在字節(jié)跳動大街的N個建筑中選定3個埋伏地點。
(2)為了相互照應(yīng),我們決定相距最遠的兩名特工間的距離不超過D。
我特喵是個天才! 經(jīng)過精密的計算,我們從X種可行的埋伏方案中選擇了一種。這個方案萬無一失,顫抖吧,孔連順!
……
萬萬沒想到,計劃還是失敗了,孔連順化妝成小龍女,混在cosplay的隊伍中逃出了字節(jié)跳動大街。只怪他的偽裝太成功了,就是楊過本人來了也發(fā)現(xiàn)不了的!
請聽題:給定N(可選作為埋伏點的建筑物數(shù))、D(相距最遠的兩名特工間的距離的最大值)以及可選建筑的坐標,計算在這次行動中,大錘的小隊有多少種埋伏選擇。
注意:
(1) 兩個特工不能埋伏在同一地點
(2)三個特工是等價的:即同樣的位置組合(A, B, C) 只算一種埋伏方法,不能因“特工之間互換位置”而重復(fù)使用
輸入描述:
第一行包含空格分隔的兩個數(shù)字 N和D(1?≤?N?≤?1000000; 1?≤?D?≤?1000000)第二行包含N個建筑物的的位置,每個位置用一個整數(shù)(取值區(qū)間為[0, 1000000])表示,從小到大排列(將字節(jié)跳動大街看做一條數(shù)軸)輸出描述:
一個數(shù)字,表示不同埋伏方案的數(shù)量。結(jié)果可能溢出,請對 99997867 取模輸入例子1:
4 3 1 2 3 4輸出例子1:
4例子說明1:
可選方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)輸入例子2:
5 19 1 10 20 30 50輸出例子2:
1例子說明2:
可選方案 (1, 10, 20)分析
? 該題目主要考察排列組合的相關(guān)知識點。每次輸入一個位置點的時候,我們可以先將該位置選上,然后確定在該位置之前符合條件的位置中選出兩個位置的組合數(shù),注意對 99997867 取模,代碼如下:
代碼
#include<stdio.h> #include <iostream> #include <vector> using namespace std;//算出在該位置之前符合條件的位置中選出兩個位置的組合數(shù) long long int C(long long int n){return (n-1) * n / 2; } int main(){long long int n, d, count = 0; // scanf("%lld %lld",&n,&d);cin>> n>> d;vector<long long int> v(n);int i,j;for (i = 0, j = 0; i < n; i++) { // scanf("%lld",&v[i]);cin>> v[i];//確定符合條件的位置while (i >= 2 && (v[i] - v[j]) > d) {j++;}count += C(i - j);} // printf("%lld\n",count % 99997867);cout << count % 99997867;return 0; }3、找零
題目描述
Z國的貨幣系統(tǒng)包含面值1元、4元、16元、64元共計4種硬幣,以及面值1024元的紙幣。現(xiàn)在小Y使用1024元的紙幣購買了一件價值為)的商品,請問最少他會收到多少硬幣?
輸入描述:
一行,包含一個數(shù)N。輸出描述:
一行,包含一個數(shù),表示最少收到的硬幣數(shù)。輸入例子1:
200輸出例子1:
17例子說明1:
花200,需要找零824塊,找12個64元硬幣,3個16元硬幣,2個4元硬幣即可。分析
先找大面值的零錢,在找小面值的零錢。
代碼
#include<stdio.h> int main(){int N,sum = 0;scanf("%d",&N);N = 1024 - N;while(N!=0){if(N>=64) N-=64;else if(N>=16) N-=16;else if(N>=4) N-=4;else N-=1;sum++;}printf("%d\n",sum);return 0; }4、雀魂啟動!
問題描述
小包最近迷上了一款叫做雀魂的麻將游戲,但是這個游戲規(guī)則太復(fù)雜,小包玩了幾個月了還是輸多贏少。
于是生氣的小包根據(jù)游戲簡化了一下規(guī)則發(fā)明了一種新的麻將,只留下一種花色,并且去除了一些特殊和牌方式(例如七對子等),具體的規(guī)則如下:
- 14張牌中有2張相同數(shù)字的牌,稱為雀頭。
- 除去上述2張牌,剩下12張牌可以組成4個順子或刻子。順子的意思是遞增的連續(xù)3個數(shù)字牌(例如234,567等),刻子的意思是相同數(shù)字的3個數(shù)字牌(例如111,777)
例如:
1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以組成1,2,6,7的4個刻子和9的雀頭,可以和牌
1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀頭,組123,123,567,789的四個順子,可以和牌
1 1 1 2 2 2 3 3 3 5 6 7 7 9 無論用1 2 3 7哪個做雀頭,都無法組成和牌的條件。
現(xiàn)在,小包從36張牌中抽取了13張牌,他想知道在剩下的23張牌中,再取一張牌,取到哪幾種數(shù)字牌可以和牌。
輸入描述:
輸入只有一行,包含13個數(shù)字,用空格分隔,每個數(shù)字在1~9之間,數(shù)據(jù)保證同種數(shù)字最多出現(xiàn)4次。輸出描述:
輸出同樣是一行,包含1個或以上的數(shù)字。代表他再取到哪些牌可以和牌。若滿足條件的有多種牌,請按從小到大的順序輸出。若沒有滿足條件的牌,請輸出一個數(shù)字0輸入例子1:
1 1 1 2 2 2 5 5 5 6 6 6 9輸出例子1:
9例子說明1:
可以組成1,2,6,7的4個刻子和9的雀頭輸入例子2:
1 1 1 1 2 2 3 3 5 6 7 8 9輸出例子2:
4 7例子說明2:
用1做雀頭,組123,123,567或456,789的四個順子輸入例子3:
1 1 1 2 2 2 3 3 3 5 7 7 9輸出例子3:
0例子說明3:
來任何牌都無法和牌分析
? 該問題可用回溯算法來進行計算,但數(shù)據(jù)量不大,在這里我選擇使用暴力法解題,主要使用三重嵌套循環(huán)來遍歷所有情況,找出符合要求的結(jié)果。
代碼
#include<stdio.h> int main(){int ans=0,a[10]={0},i,j,k,temp,b[12]={0},flag=0;for(i=0;i<13;i++){scanf("%d",&temp);a[temp]++;}//第一重循環(huán),假設(shè)答案,假設(shè)應(yīng)該取的牌為kfor(k=1;k<10;k++){//一種牌最多只能擁有四張if(a[k]==4) continue;a[k]++;//取牌//第二重循環(huán),假設(shè)雀頭for(i=1;i<10;i++){for(j=1;j<10;j++) b[j] = a[j];ans = k;int f=0;//順子和刻子的數(shù)量//假設(shè)i為雀頭if(b[i]>=2){b[i]-=2;//第三重循環(huán),確定能否和牌for(j=1;j<10;j++){//刻子if(b[j]>=3) {b[j]-=3;f++;}//順子while(b[j]>0&&b[j+1]>0&&b[j+2]>0){b[j]--;b[j+1]--;b[j+2]--;f++;}//剪枝if(b[j-1]>0&&b[j-1]<3&&j>1) break;}}//和牌if(f==4) break;ans = 0;} if(ans!=0){printf("%d ",ans);flag=1;//修改和牌標記}a[k]--;//擬回溯}if(flag==0) printf("0"); //未和牌printf("\n");return 0; }總結(jié)
以上是生活随笔為你收集整理的[C语言]字节跳动2019春招研发部分编程题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arduino MP3 音乐播放器
- 下一篇: 计算机游戏与动漫设计大赛,西安综合职业中