2020大廠筆試 | 關於字節跳動的兩道題

微信公衆號:Jerry的算法和NLPpython

| 題目1 圓形花園的入口

小區花園裏有n個入口,如今要修一些路,要求每一個入口只能有一條路,且每條路之間互不相交,求輸入爲n的時候有幾條路正則表達式

| examlple:

2020大廠筆試 | 關於字節跳動的兩道題

| 分析:

這道題目主要考察的知識點爲動態規劃
動態規劃主要就是要找準它的轉移方程和base case以及目標算法

題目中提到,N是一個輸入爲2-1000的偶數
先找base case:
N=2 dp[2]=1 只有一條路 那麼只有一種狀況 這個好理解
N=4 dp[4]=2
N=6 dp[6]=5數組

當N=8的時候,怎麼分析?微信

2020大廠筆試 | 關於字節跳動的兩道題

如今把每一個門都標上了號碼牌,咱們假設咱們從1開始看。數據結構

1一開始能夠和 2或者 8 相連,那麼剩下了6個門,那麼剩下六個門連通的可能總數爲dp[6](前面已經計算了)app

1能夠和7相連嗎?不能夠,由於這樣8不管如何都會使得他們相交
因此咱們必須隔兩個門取。機器學習

1接下來和 2+2=4 或者 8-2=6 相連 當1和4相連的時候 剩下的六個門組合爲dp[2]*dp[4]ide

此時 1 再和 4+2=6 或者 6-2=4 相連 此時已經發生了重複計算的狀況,設置好跳出條件便可函數

| 總結

先鎖定一個門(假設爲1),從兩端開始 先和距離爲1的門相連,而後距離爲3 距離爲5直至發生重複計算跳出循環
或者從一端開始直至繞了一圈回到1這個門的時候跳出循環

| Python代碼

1a=int(input())
 2dp=[0 for i in range(a+1)]
 3dp[0]=0
 4dp[2]=1
 5dp[4]=2
 6dp[6]=5
 7for i in range(8,a+2,2):
 8    for j in range(i-2,0,-2):
 9        if j<i-j-2:
10            break
11        else:
12            if j==i-2:
13                dp[i]+=dp[i-2]*2
14            elif  j==i-2-j:
15                dp[i]+=dp[j]*dp[j]
16            else:
17                dp[i]+=dp[j]*dp[i-2-j]*2
18print(dp[a])

| 題目2 2048的操做

2048遊戲是一個44的矩陣,用戶能夠按上下左右4個方向鍵讓全部的方塊向同個方向運動,兩個相同數字方塊撞一塊兒以後合併成爲他們的和,每次操做以後隨機生成個2或者4合併規則:相鄰會撞的兩個數字合而且一個位置只會觸發一次合併,且優先合併移動方向頂部的位置

好比【2,2,2,2】合併後【0,0,4,4】
【0,2,2,2】合併後【0,0,2,4】

輸入第一行是用戶按下的方向鍵,1表明上,2表明下,3表明左,4表明右接下來是一個44的矩陣,空格分割,0表明該位置沒有數字

| 分析

這個題目其實就是考察對邊界條件的斷定和對兩數之間的值是否相等的斷定

python 代碼

1com = int(input())
 2l=[]
 3for _ in range(4):
 4    l.append(list(map(int,input().split())))
 5
 6if com == 1:
 7    for i in range(3, 0, -1):
 8        for j in range(4):
 9            if l[i-1][j] == l[i][j]:
10                l[i][j] = 0
11                l[i-1][j] *= 2
12
13            for k in range(3, 0, -1):
14                if l[k-1][j] == 0 and l[k][j] != 0:
15                    l[k-1][j] = l[k][j]
16                    l[k][j] = 0
17                if l[k-1][j] == l[k][j]:
18                    l[k-1][j] *= 2
19                    l[k][j] = 0
20
21elif com == 2:
22    for i in range(0, 3, 1):
23        print(i)
24        for j in range(4):
25            if l[i + 1][j] == l[i][j]:
26                l[i][j] = 0
27                l[i + 1][j] *= 2
28
29            for k in range(0, 3, 1):
30                if l[k + 1][j] == 0 and l[k][j] != 0:
31                    l[k + 1][j] = l[k][j]
32                    l[k][j] = 0
33                if l[k + 1][j] == l[k][j]:
34                    l[k + 1][j] *= 2
35                    l[k][j] = 0
36elif com == 3:
37    for i in range(4):
38        print(i)
39        for j in range(3, 0, -1):
40            if l[i][j - 1] == l[i][j]:
41                l[i][j] = 0
42                l[i][j - 1] *= 2
43
44            for k in range(3, 0, -1):
45                if l[i][k - 1] == 0 and l[i][k] != 0:
46                    l[i][k - 1] = l[i][k]
47                    l[i][k] = 0
48                if l[i][k - 1] == l[i][k]:
49                    l[i][k - 1] *= 2
50                    l[i][k] = 0
51
52elif com == 4:
53    for i in range(4):
54        print(i)
55        for j in range(0, 3, 1):
56            if l[i][j + 1] == l[i][j]:
57                l[i][j] = 0
58                l[i][j + 1] *= 2
59
60            for k in range(0, 3, 1):
61                if l[i][k + 1] == 0 and l[i][k] != 0:
62                    l[i][k + 1] = l[i][k]
63                    l[i][k] = 0
64                if l[i][k + 1] == l[i][k]:
65                    l[i][k + 1] *= 2
66                    l[i][k] = 0
67
68for i in range(4):
69    print(" ".join(map(str, l[i])))

後記

2020大廠筆試 | 網易提早批(1)

2020大廠筆試 | 網易提早批(2)

2020大廠真題 | 騰訊筆試

揹包九講(1)0/1揹包問題

揹包九講(2)徹底揹包問題

數據結構類題目

  • LinkedList
  • 003-從尾到頭打印鏈表
  • 014-鏈表中倒數第k個結點
  • 015-反轉鏈表
  • 016-合併兩個或k個有序鏈表
  • 025-複雜鏈表的複製
  • 036-兩個鏈表的第一個公共結點
  • 055-鏈表中環的入口結點
  • 056-刪除鏈表中重複的結點
  • Tree
  • 004-重建二叉樹
  • 017-樹的子結構
  • 018-二叉樹的鏡像
  • 022-從上往下打印二叉樹
  • 023-二叉搜索樹的後序遍歷序列
  • 024-二叉樹中和爲某一值的路徑
  • 026-二叉搜索樹與雙向鏈表
  • 038-二叉樹的深度
  • 039-平衡二叉樹
  • 057-二叉樹的下一個結點
  • 058-對稱的二叉樹
  • 059-按之字形順序打印二叉樹
  • 060-把二叉樹打印成多行
  • 061-序列化二叉樹
  • 062-二叉搜索樹的第k個結點
  • Stack & Queue
  • 005-用兩個棧實現隊列
  • 020-包含min函數的棧
  • 021-棧的壓入、彈出序列
  • 044-翻轉單詞順序列(棧)
  • 064-滑動窗口的最大值(雙端隊列)
  • Heap
  • 029-最小的K個數
  • Hash Table
  • 034-第一個只出現一次的字符
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 具體算法類題目
  • 斐波那契數列
  • 007-斐波拉契數列
  • 008-跳臺階
  • 009-變態跳臺階
  • 010-矩形覆蓋
  • 搜索算法
  • 001-二維數組查找
  • 006-旋轉數組的最小數字(二分查找)
  • 037-數字在排序數組中出現的次數(二分查找)
  • 全排列
  • 027-字符串的排列
  • 動態規劃
  • 030-連續子數組的最大和
  • 052-正則表達式匹配(我用的暴力)
  • 回溯
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 排序
  • 035-數組中的逆序對(歸併排序)
  • 029-最小的K個數(堆排序)
  • 029-最小的K個數(快速排序)
  • 位運算
  • 011-二進制中1的個數
  • 012-數值的整數次方
  • 040-數組中只出現一次的數字
  • 其餘算法
  • 002-替換空格
  • 013-調整數組順序使奇數位於偶數前面
  • 028-數組中出現次數超過一半的數字
  • 031-整數中1出現的次數(從1到n整數中1出現的次數)
  • 032-把數組排成最小的數
  • 033-醜數
  • 041-和爲S的連續正數序列(滑動窗口思想)
  • 042-和爲S的兩個數字(雙指針思想)
  • 043-左旋轉字符串(矩陣翻轉)
  • 046-孩子們的遊戲-圓圈中最後剩下的數(約瑟夫環)
  • 051-構建乘積數組

劍指offer刷題交流羣

掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。

2020大廠筆試 | 關於字節跳動的兩道題
▲長按加羣

2020大廠筆試 | 關於字節跳動的兩道題

相關文章
相關標籤/搜索