一、
[程式設計題
]回文解碼
現在有乙個字串,你要對這個字串進行
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 字串長度...