牛客網 今日頭條2017客戶端工程師實習生筆試題

2021-07-25 07:22:37 字數 4604 閱讀 1824

一、

[程式設計題

]回文解碼

現在有乙個字串,你要對這個字串進行

n次操作,每次操作給出兩個數字:

(p, l)

表示當前字串中從下標為

p的字元開始的長度為

l的乙個子串。你要將這個子串左右翻轉後插在這個子串原來位置的正後方,求最後得到的字串是什麼。字串的下標是從

0開始的,你可以從樣例中得到更多資訊。

輸入描述:

每組測試用例僅包含一組資料,每組資料第一行為原字串,長度不超過

10,僅包含大小寫字元與數字。接下來會有乙個數字

n表示有

n 個操作,再接下來有

n行,每行兩個整數,表示每次操作的

(p , l)

。保證輸入的操作一定合法,最後得到的字串長度不超過

1000。

輸出描述:

輸出乙個字串代表最後得到的字串。

輸入例子:ab2

0 21 3

輸出例子:

abbaabb

c++**如下:

#include#include#include#includeusing namespace std;

int main()//while

cout<

二、[

程式設計題]

出**

你作為一名出道的歌手終於要出自己的第乙份**了,你計畫收錄

n首歌而且每首歌的長度都是

s秒,每首歌必須完整地收錄於一張

cd當中。每張

cd的容量長度都是

l 秒,而且你至少得保證同一張

cd內相鄰兩首歌中間至少要隔

1秒。為了辟邪,你決定任意一張

cd內的歌數不能被

13 這個數字整除,那麼請問你出這張**至少需要多少張cd?

輸入描述:

每組測試用例僅包含一組資料,每組資料第一行為三個正整數

n, s, l。保證

n ≤ 100 , s ≤ l ≤ 10000

輸出描述:

輸出乙個整數代表你至少需要的

cd數量。

輸入例子:

7 2 6

58 4 163

27 1 27

輸出例子:42

3 思路:

先算出每個cd可以裝下的歌曲數量num_eachcd,假設乙個cd有t首歌,那麼乙個cd的容量為t*s+t-1=l,可以推出t = (l+1)/(s+1),所以num_eachcd = (l+1)/(s+1)。

由題意可知每個cd的歌曲數量不能是13的倍數,所以如果num_eachcd%13=0時,num_eachcd要減1。

一共有n首歌,用num_cd表示需要的cd數,那麼num_cd=(n/num_eachcd)。如果num_eachcd不能被n整除,說明有幾首歌被剩下了,此時num_cd應加1。

如果num_cd=1,說明一張cd就可以放下了。總數是n首歌,說明一張cd放了n首歌,如果n%13=0,那麼還需要加一張cd。

如果num_cd>1,說明要多張cd才可以放下。一開始已經判斷了num_eachcd不會是13的倍數了,所以還需要判斷一下最後可能剩下的n%num_eachcd是否是13的倍數。如果num_lastcd=n%num_eachcd是13的倍數,但是num_eachcd比num_lastcd大不止1,那麼可以從num_eachcd中分一或者兩首歌到最後這個cd中。因為顯然num_eachcd減1或者2後肯定有乙個情況不會是13的倍數。但是如果num_lastcd是13的倍數,且num_eachcd比num_lastcd大1,此時不管怎麼補都無法實現所有的cd都不是13的倍數,且乙個cd的容量不溢位。此時只能再新增乙個cd。

c++**:

#includeusing namespacestd;

int main()

//算是不是會剩下幾首歌正好是13的倍數

int num_cd = n/num_eachcd;

//說明有幾首歌單出來了

if(n % num_eachcd > 0)

if(num_cd == 1)

}else

}//else

cout<

三、[

程式設計題]

魔法權值

給出

n個字串,對於每個

n個排列

p,按排列給出的順序

(p[0] , p[1] …p[n-1])

依次連線這

n個字串都能得到乙個長度為這些字串長度之和的字串。所以按照這個方法一共可以生成

n!個字串。

乙個字串的權值等於把這個字串迴圈左移

i次後得到的字串仍和原字串全等的數量,

i的取值為

[1 ,

字串長度

]。求這些字串最後生成的

n!個字串中權值為

k的有多少個。

注:定義把乙個串迴圈左移

1次等價於把這個串的第乙個字元移動到最後乙個字元的後面。

輸入描述:

每組測試用例僅包含一組資料,每組資料第一行為兩個正整數

n, k,n

的大小不超過8 ,

k不超過

200。接下來有

n行,每行乙個長度不超過

20且僅包含大寫字母的字串。

輸出描述:

輸出乙個整數代表權值為

k的字串數量。

輸入例子:

3 2ab

raabra

輸出例子:3

思路:本題主要是理清題意,我一開始就沒有看懂題目。還是谷歌了之後在別人的幫助下搞清楚題意的。

第一行輸入n和k,n表示有n個字串,k表示權值。接下來有n行輸入 ab

raab ra

重點理解一下k要表達的含義:k代表乙個字串的權值,最終結果讓程式輸出。權值等於k的數量,而k等於乙個字串迴圈左移i次後得到的字串仍和原字串全等的數量,由於i的取值為1到字串長度len,所以k的最小值是1,因為任何乙個字串左移長度len後都和原字串相等。

k的含義搞清楚了,下面求字串。由題目可知會生成n!種字串,那麼能想到全排列的情況,假設用1表示第乙個字串ab,2表示第二個字串raab,3表示第三個字串ra,那麼根據全排列一共有6種情況。

1 2 3:ab raab ra(偏移後和原串相等的偏移量i=4、8),則k=count(i)=2

1 3 2:ab ra raab(偏移量i=8),k=1

2 1 3:raab ab ra(偏移量i=8),k=1

2 3 1:raab ra ab(偏移量i=4、8),k=2

3 1 2:ra ab raab(偏移量i=4、8),k=2

3 2 1:ra raab ab(偏移量i=8),k=1

則輸出k==2的數量,count(k==2)=3

所以輸出為3

c++**

#include#include#include#include/*

執行超時:您的程式未能在規定時間內執行結束,請檢查是否迴圈有錯或演算法複雜度過大。

case通過率為60.00%

*/using namespace std;

int main()//for

int count=0; //用來計數權值為k的字串個數

//先進行第乙個全排列字串的權值判斷

int each_count=0; //用來計數每個字串進行迴圈左移動過程中等於原字串的次數

string str1,str2;

for(i=0;i

上面的**只對了60%,提示超時了

通過谷歌看了一下別人的思路,在對字串進行偏移和比較部分還可以進一步優化。優化後的**ac成功,如下:

#include#include#include#includeusing namespace std;

int main()//for

int count=0; //用來計數權值為k的字串個數

//先進行第乙個全排列字串的權值判斷

//進行全排列

do//while

int i,j;

while(k!=0)//while

int x_len=x_binary.size();

int k_len=k_binary.size();

j=0;

for(i=0;i=0;i--)

cout<

大神的**:

#includeusing namespace std;

int main()

bitnum<<= 1;

}cout

}

今日頭條 2017客戶端工程師實習生筆試題

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2016 09 05 題目一 很簡單,按照題目要求做即可ac.include include using namespace std int main str str.insert p l,in.c str cout str endl return...

今日頭條2017客戶端工程師實習生筆試題

你作為一名出道的歌手終於要出自己的第乙份 了,你計畫收錄 n 首歌而且每首歌的長度都是 s 秒,每首歌必須完整地收錄於一張 cd 當中。每張 cd 的容量長度都是 l 秒,而且你至少得保證同一張 cd 內相鄰兩首歌中間至少要隔 1 秒。為了辟邪,你決定任意一張 cd 內的歌數不能被 13 這個數字整...

今日頭條2017後端工程師實習生筆試題

給出 n 個字串,對於每個 n 個排列 p,按排列給出的順序 p 0 p 1 p n 1 依次連線這 n 個字串都能得到乙個長度為這些字串長度之和的字串。所以按照這個方法一共可以生成 n 個字串。乙個字串的權值等於把這個字串迴圈左移 i 次後得到的字串仍和原字串全等的數量,i 的取值為 1 字串長度...