深信服筆試 遞迴用法

2022-05-05 06:33:08 字數 4341 閱讀 8705

1、已知某乙個字母序列,把序列中的字母按出現順序壓入乙個棧,在入棧的任意過程中,允許棧中的字母出棧,求所有可能的出棧順序

思路:遍歷序列中的每乙個字母,先把當前字母入棧,這個時候,棧中肯定有字母,你可以選擇繼續遍歷序列,也可以在這個時候把棧中的字母乙個乙個出棧,

最後,遍歷完序列後,再把棧中的所有字母順序出棧,這樣子就可以得到所有合法的序列;

1

#import itertools

2def

getallseq(input, i, stk, tmp, res):

3 tmp1 =list(tmp) # 注意tmp1和stk是要回溯的,所以這兩者不能傳引用;而res是一直保留結果的,傳引用就對

4 stk1 =list(stk)

5if i ==len(input): # 結果記錄

6 stk1 = stk1[::-1]

7tmp1.extend(stk1)89

#print(res)

10return

1112 getallseq(input, i+1, stk1, tmp1, res) #繼續遍歷

13while

stk1: # 乙個個出棧14#

tmp =

16stk1.pop()

17 getallseq(input, i+1, stk1, tmp1, res)

1819

2021 input = '

abc'

22 res =

23 stk = ''

24 tmp = ''

25getallseq(input, 0, stk, tmp, res)

2627 res = [''.join(x) for x in

res]28#

法一29

#res = list(set(res))30#

res.sort()

3132#法二

33#res = itertools.groupby(res)

3435

#法三 dict去重並保留順序36#

res = list(dict.fromkeys(res))37#

print(res)

2、函式match檢查字串str是否匹配模板pattern,匹配則返回0,否則返回-1。模板支援普通字元(a-z0-9a-z)及萬用字元?和*。普通字元匹配該字元本身,?匹配任意乙個字元,*匹配任意多個任意字元。

思路:使用遞迴回溯遍歷所有的情況

def

match(str, pattern):

str_len, pattern_len =len(str), len(pattern)

ifnot str_len and

notpattern_len:

return

0

ifnot str_len or

notpattern_len:

return -1

if pattern[0] == '*'

: #如果是*則前者遞迴k個單位(k進行迭代遍歷取值),後者遞迴乙個單位

for i in

range(len(str)):

if match(str[i+1:], pattern[1:]) == 0: #

遞迴return

0

return -1

elif pattern[0] == '?'

: # 如果是?則兩者都遞迴乙個單位

return match(str[1:], pattern[1:])

else

:

if pattern[0] ==str[0]: # 如果是相同則兩者都遞迴乙個單位

return match(str[1:], pattern[1:])

else

:

return -1str =input()

pattern =input()

res =match(str, pattern)

print

(res)

if res ==0:

print('

match')

elif res == -1:

print('

unmat

3、有k種顏色的小球(k<=10),每種小球有若干個,總數小於100個。

現在有乙個小盒子,能放n個小球(n<=8),現在要從這些小球裡挑出n個小球,放滿盒子。

想知道有哪些挑選方式。注:每種顏色的小球之間沒有差別。

請按數字遞增順序輸出挑選小球的所有方式。

如有3種顏色,每種顏色小球的個數分別為a:1,b:2,c:3,挑出3個小球的挑法有:

003,012,021,102,111,120

思路:遞迴回溯,my_dic, res, s都可變,s用來儲存理想結果,注意s的現場恢復

#

k, n = list(map(int, input().split()))

#def bfs(i, my_dic, cnt, res, s):

#if i == k and cnt == n:##

elif i < k:

#for use in range(my_dic[i]+1): # 迭代遞迴:先迭代整個串,然後再遞迴每個子集

#if use <= n - cnt:##

bfs(i+1, my_dic, cnt+use, res, s)

#s.pop() #回溯

#else:

#break

#my_dic = {}

#for i in range(k):

#my_dic[i] = int(input())

#res =

#bfs(0, my_dic, 0, res, )

#for r in res:

#print(r)

a = [0] * 11ans = [0] * 11

defprint(k, ans):

res = ''

for i in

range(k):

res +=str(ans[i])

print

(res)

deffun(i, n):

if n ==0:

print(k, ans)

return

if n < 0 or k ==i:

return

for j in range(a[i]+1):

ans[i] =j

fun(i+1, n-j)

ans[i] = 0 #

回溯k,n =list(map(int, input().split()))

a ={}

for i in

range(k):

a[i] =int(input())

fun(0, n)

4、判斷所給的字串是否由所給的詞典中的若干個詞組成。

如已知詞典["code", "sangfor", "org"]

則字串"codesangfororg" 由上述詞典組成,

字串"codesangforsangfororg" 也由上述詞典組成,

但字串"sangforcom" 則不由上述詞典組成。

def

wordbreak(s, worddict):

ifnot s or

notlen(s):

return

false

dp = [false for i in range(len(s)+1)]

dp[0] =true

for i in range(1, len(s)+1): # 迭代遞迴:先迭代遍歷整個串,然後再對每個子串進行遞迴遍歷

for j in

range(i):

if dp[j] and (s[j:i] in

worddict):

dp[i] =true

break

return

dp[len(s)]

k =int(input())

worddict =

for i in

range(k):

s =input()

res =wordbreak(s, worddict)

print(res)

5、總結

先看問題是否是求整體字串中的可變長子集(起始點不確定),如果是則先迭代遍歷整個串,然後在遞迴每個子串,如3、4題;

如果是起始點確定的可變長子集,如2題,則可以不用迭代遍歷整個串,只需要遞迴遍歷子串就行。

深信服筆試題

題很多,共8頁 1.sort int array,int n 排序,讓小於等於0的數放在左邊,大於0得數放在右邊,要求時間複雜度為o n 2.假設有1001個棋子,你和乙個人拿這些棋子,誰拿到最後乙個,算誰贏,每次只能拿1,2,4個棋子。你先出手,是否有把握必贏,如果沒有,說明為什麼。3.編寫ato...

深信服筆試題

做了一波深信服的筆試題 題目難度定義成一般吧,程式設計題前兩道還好,第一道考察的是格式化字串,第二道考察的是階乘。第三道。忘了 其餘都是選擇題,知識點也比較廣泛,考察的知識點我把我記住的例下來 1 行內元素 a,b,br,em,font,i,img,input,label,select,span.塊...

深信服筆試題

1.子串模糊匹配 var readline require readline rl readline.createinte ce var k 2 var inputs rl.on line function data function main a,b var pattern newregexp r...