樂港2017校招筆試題

2022-03-22 05:42:28 字數 1724 閱讀 8062

前言

今天通知過了筆試,但覺得筆試沒來得及做的題還是要做一下。

題目

第二道題,字串的,大意就是,給你個形如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...