前言
今天通知過了筆試,但覺得筆試沒來得及做的題還是要做一下。
題目
第二道題,字串的,大意就是,給你個形如a,b,c,ab,bb,cb,ac,bc,cc,aab,bab,cab,abb,bbb,cbb,acb,bcb,ccb......按某種規律排列的無限長的字串陣列,要求:
1)給定乙個位置,輸出對應的字串。
2)給定乙個字串,找出它在這個陣列裡的位置。
思路
仔細觀察會發現其實就是用a,b,c在每乙個字串上不斷迴圈頭插得到新的字串,比如a,b,c迴圈在b,c字元上頭插得到,ab,bb,cb,ac,bc,cc,然後又在,ab,bb,cb,ac,bc,cc字串的頭部插入得到,aab,bab,cab,abb,bbb,cbb,acb,bcb,ccb......ccc。也就是說n位長度的一系列字串是在n-1位長度的字串上頭插a,b,c得到的。那麼可以用乙個動態增長的陣列來模擬這種情況,c++的vector是個不錯的選擇。
另外還要知道的是:n位長的字串集合的最後乙個字串在該陣列中的位置是3 ^ n,比如1位長的最後乙個字元是「c」,位置在3^1 = 3。同理2位長度的最後乙個字串"cc"位置為9,同理"ccc"位置為27,以此類推。所以陣列不管如何更新,它的長度一定是3^n,且n位長度的字串的個數為2 * 3^(n - 2)。
那麼對於 題目1) 求指定位置的字串有如下**:
#include#include#include
using
namespace
std;
const
string
base = "
abc"
;int
main()
; //
動態增長的字串陣列,從1開始操作更方便
while(cin >> pos) //
根據輸入的位置來更新陣列
//沒有的話就把它所在的對應位數的所有字串放入陣列中
int digit = 1
;
while(pow(3,digit) int end = pow(3,digit - 1); //
digit - 1位字串的結束位置
//int dis = num - len;
int start = 1 + len - 2 * pow(3,res[len].size() - 1); //
res中的最多位數的字串集合的開始位置
while(start != end) //
開始更新字串陣列
start++;
}cout
<< res[index] << endl; //
輸出對應位置的字串即可
}}
可以看到初始我是先把a,b,c放入陣列中。然後基於輸入的位置來確定需要更新到的最大位數。
對於題目2)求指定字串的位置,
1.可以根據它的長度l確定它所在集合的最後乙個字串的位置lastpos = pow(3,l)。
2.求這個字串集合的首位置startpos = lastpos - 2 * 3^(l- 2) + 1。
3.然後在[startpos,lastpos]區間找這個字串就行,如果lastpos > res的長度,轉4.
4.如果lastpos > res的長度就用題目1)的解決方法更新res的內容就行,然後再去查詢。
2017校招筆試題
題目 輸入乙個字串從左到右遍歷,如果遇到三個連續相同的子串就將這個子串刪除,並將原串剩下的部分拼接到一起,重複上述過程,直到字串中沒有可以刪除的子串。eg 輸入 aaabccdddcb aabbbabbba 輸出 bb a重要 從乙個字串中刪除乙個子串,必須將原字串的內容strcpy到開闢的數字中 ...
好未來2017校招筆試
一.描述下程序和執行緒的區別 1.當程序發生排程時,它擁有乙個完整地虛擬位址空間,但不同的程序擁有不同的虛擬位址空間 而同一程序內的不同執行緒共享其所屬程序的同一位址空間 3.程序的排程與切換由作業系統核心完成,而執行緒的排程可由作業系統完成,也可由使用者完成 4.在多執行緒作業系統中,執行緒是系統...
京東校招筆試題
題目摘自牛客網 給定字串 ascii碼0 255 陣列,請在不開闢額外空間的情況下刪除開始和結尾處的空格,並將中間的多個連續的空格合併成乙個。例如 i am a little boy.變成 i am a little boy 語言不限,但不要用偽 作答,函式輸入輸出請參考如下的函式原型 void f...