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

2021-07-16 17:45:02 字數 4103 閱讀 2488

給出 n 個字串,對於每個 n 個排列 p,按排列給出的順序(p[0] , p[1] … p[n-1])依次連線這 n 個字串都能得到乙個長度為這些字串長度之和的字串。所以按照這個方法一共可以生成 n! 個字串。

乙個字串的權值等於把這個字串迴圈左移 i 次後得到的字串仍和原字串全等的數量,i 的取值為 [1 , 字串長度]。求這些字串最後生成的 n! 個字串中權值為 k 的有多少個。

注:定義把乙個串迴圈左移 1 次等價於把這個串的第乙個字元移動到最後乙個字元的後面。

1、模擬過程:位移後不變的情況數為k的字串個數。

2、全排列:next_permutation(pos.begin(), pos.end()),注意寫法do-while。

3、對於位移後字串的比較直接迴圈就好了,不必真正的去構造位移後的字串。

reference:全排列

#include 

#include

#include

#include

using

namespace

std;

bool isequal(string &str, int offset, int &len)

for(int i=len-offset,j=0;i//

if(str[i]!=str[j]) return

false;

} return

true;

}//結果求取

int getresult(vector

&v, int &n, int &k)

vector

> va(a);

vector

vsa(a);

vector

pos(n);

for (int i = 0;i < n;++i)

int i = 0;

//全排列

do ++i;

} while (next_permutation(pos.begin(), pos.end()));

//全排列轉換為相應字串

for (i = 0;istring str;

for (int j = 0;j//judge

int sz = vsa[0].length(), res;

for (i = 0;iint kvalue = 1;

for (int j = 1;jif (vsa[i][j] == vsa[i][0] && isequal(vsa[i], j, sz))

}if (kvalue == k) ++res;

}return res;

}int main()

cout

<< getresult(v, n, k) << endl;

}return

0;}

有 n 個字串,每個字串都是由 a-j 的大寫字元構成。現在你將每個字元對映為乙個 0-9 的數字,不同字元對映為不同的數字。這樣每個字串就可以看做乙個整數,唯一的要求是這些整數必須是正整數且它們的字串不能有前導零。現在問你怎樣對映字元才能使得這些字串表示的整數之和最大?

1、學會權重解決貪心問題。個位+1,百位+100。

2、讓map根據關鍵字降序排列。

multimap

int,greater> mnum;//降序排列

3、權重*對映值。

#define ull unsigned long long

#include

#include

#include

#include

#include

using

namespace

std;

ull getmaxsum(vector

&vs, int &n) ;//weight

for (int i = 0;i//計算權重

ull k = 1;

for (auto iter = vs[i].rbegin();iter != vs[i].rend();++iter)

}multimap

int,greater> mnum;//降序排列

for (int i = 0;i<10;++i) );

}int i = 9;

for (auto iter = mnum.begin();iter != mnum.end();++iter)

ull nhash[10];//tran number

for (i = 0;i<10;++i) }}

int fithash[10];

//前導0問題

for (i = 0;i<10;++i)

for (i = 0;i0] - 65] = 10;

}int minpos = 10, minval = 10;

for (i = 0;i<10;++i)

ull res;

for (i = 0;i<10;++i)

return res;

}int main()

cout

<< getmaxsum(vs, n) << endl;

}return

0;}

有乙個由很多木棒構成的集合,每個木棒有對應的長度,請問能否用集合中的這些木棒以某個順序首尾相連構成乙個面積大於 0 的簡單多邊形且所有木棒都要用上,簡單多邊形即不會自交的多邊形。

初始集合是空的,有兩種操作,要麼給集合新增乙個長度為 l 的木棒,要麼刪去集合中已經有的某個木棒。每次操作結束後你都需要告知是否能用集合中的這些木棒構成乙個簡單多邊形。

不得不說,這是我這套題中唯一按時完成的一題。

1、sum,可以在資料插入的時候解決。不必最後求取。

2、mset.erase(iter);set除了支援關鍵字刪除,還可以迭代器刪除,可以傳入乙個或是一對。

3、sum-max_len>max_len即符合要求。

4、相比我之前使用的vector要好太多。

#include 

#include

using

namespace

std;

bool judge(multiset

&mset,int &sum)

auto iter=mset.rbegin();

if(sum-*iter<=*iter) return

false;

else

return

true;

}int main()

else

}if(judge(mset,sum))

給定 x, k ,求滿足 x + y = x | y 的第 k 小的正整數 y 。 | 是二進位制的或(or)運算,例如 3 | 5 = 7。

比如當 x=5,k=1時返回 2,因為5+1=6 不等於 5|1=5,而 5+2=7 等於 5 | 2 = 7。

這一題,我怎麼寫都超時,直到看了別人的**,才發現,自己活該超時。

1、尋找規律,其實y的bit位的1就出現在x的bit位不為1的地方,將這些置位對應為排列起來便是普通的1、2、3….

2、如何利用這些規律?其實我本來已經找到了這個規律,但是我想到的還是加比如5,y=0,y+=2,y+=6,y+=2,y+=6交叉加k次。結果超時。

3、我們要將規律轉化為位運算,既然我們是通過位的變化找到的規律,那麼我們一定可以通過位運算獲取結果。

4、結果的位變化全部發生在x的非置位上面,並且是正常的進製,與k同步,那麼我們可以將k的值放在對應x的非置位位上面,其餘位置0。

#include 

#include

using

namespace

std;

unsigned

long

long gety(unsigned

long

long &x,unsigned

long

long &k)

bitnum<<=1;

}return ans;

}int main()

今日頭條 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次操作,每次操作給出兩個數字 p,l 表示當前字串中從下標為 p的字元開始的長度為 l的乙個子串。你要將這個子串左右翻轉後插在這個子串原來位置的正後方,求最後得到的字串是什麼。字串的下標是從 0開始的,你可以從樣例中得到更多資訊。輸入描...