online coding case, since 2020-05-23

2020-05-23
Case 1(easy): 上山下山問題
,上山一步用U表示菇晃,下山一步用D表示完慧,起始點(diǎn)和結(jié)束點(diǎn)都是sea level屈尼。一個(gè)從sea level開始的[U,D]序列,求其中經(jīng)過了幾次valley甲捏。

思路:vallery中可能有山鞭执,但只要山的高度沒有超過vallery的深度就可以仍然算作一個(gè)vallery兄纺。也就是只要sl沒有從負(fù)值變成0,則可算作一個(gè)vallery钦奋。sl正時(shí)不考慮。設(shè)定一個(gè)sea level指標(biāo)sl朦拖,每經(jīng)過一個(gè)U則sl+1厌衔,經(jīng)過D則sl-1富寿。當(dāng)sl+1后等于0,則vallery counter+1.

def countingValleys(n, s):
    if not 0 <= n <= 10**6:
        return 'again'
    cv = 0
    sl = 0
    for st in s:
        if st == 'U':
            sl += 1
            if sl == 0:
                cv +=1
        elif st == 'D':
            sl -= 1
    return cv

Case 2 (medium): 排隊(duì)相鄰交換問題理疙,排隊(duì)的每個(gè)人有從1到n的序號(hào)泞坦,按順序發(fā)放砖顷。但是有人會(huì)bribe前面緊鄰的一個(gè)人交換位置滤蝠。每個(gè)人最多只能bribe兩次。先提供一個(gè)序列锣险,求出這個(gè)隊(duì)伍中發(fā)生了幾次bribe使得位置交換成這樣览闰。如21534压鉴,2 bribed 1(1次),5依次bribed 3/4(2次)击蹲,累計(jì)有3次bribe婉宰。但25134這個(gè)序列則不滿足條件心包,輸出too chaotic,因?yàn)?需要bribe超過兩次才能到這個(gè)位置轮听。
思路1:復(fù)雜度為O(n^2)。經(jīng)過bribe調(diào)整后隊(duì)列上的元素用e'_i表示萧锉,ie'_i在隊(duì)列上的索引柿隙。比較e'_ie'_j (j>i)的大小鲫凶,并計(jì)算比e'_i小的元素個(gè)數(shù)s'_i = \# (e'_{j} < e'_i), j>i。遍歷這個(gè)隊(duì)列波附,對(duì)每個(gè)e'_i做這樣的操作昼钻,所有e'_i對(duì)應(yīng)的s'_i之和t = \sum_{i=0}^{n-1}s'_i然评。得到的t就是bribe調(diào)整的次數(shù)。注意在測(cè)試中一旦s'_i>2則認(rèn)為too chaotic盏求。
這個(gè)問題的假設(shè)是每個(gè)人只能bribe前面的人碎罚,不會(huì)bribe后面的人缕探,不然就not make sense了爹耗。該思路的缺點(diǎn)是復(fù)雜度高。

def minimumBribes(q):
    if not 1 <= len(q) <= 10**5:
        return 'again'
    res = 0
    for i, e in enumerate(q):
        t = max(e-i-1,0)
        if t > 2:
            res = 'Too chaotic'
            break
        if i < len(q) - 1:
            tl = [True for term in q[i+1:] if term-e < 0]
            if sum(tl)>0:
                res += sum(tl)
    print(res)

思路2:一種復(fù)雜度為O(n)的算法
用到分治法倦始。

(2020.06.06 Sat)
Case 3 (medium): Power Sum問題冪之和問題。給定一個(gè)數(shù)字X山卦,和冪次數(shù)N鞋邑,找出X可以用多少種N次冪之和的表達(dá)形式。1<=X<=1000,2<=N<=10枚碗。例: X=100逾一,N=2,輸出3肮雨,因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=100%3D10%5E2%3D6%5E2%2B8%5E2%3D1%5E2%2B3%5E2%2B4%5E2%2B5%5E2%2B7%5E2" alt="100=10^2=6^2+8^2=1^2+3^2+4^2+5^2+7^2" mathimg="1">共三種表達(dá)遵堵。提示用recursion。
思路:討論者給出的思路怨规,智慧得到了成長(zhǎng)。

def cal_num(X, N, num):
    if pow(num, N) < X:
        return cal_num(X, N, num+1) + cal_num(X-pow(num,N), N, num+1)
    elif pow(num, N) == X:
        return 1
    else:
        return 0
ans = cal_num(X, N, 1)

(2020.09.21 Mon)
Case 4 Minimal absolute difference in a list 序列中的最小絕對(duì)值
原題在這里
一個(gè)list中的元素兩兩計(jì)算差的絕對(duì)值波丰,找出其中的最小值壳坪。
如果從頭遍歷,則需要計(jì)算每個(gè)元素與其后的元素的abs diff掰烟,復(fù)雜度為O(n^2)爽蝴。降低復(fù)雜度,首先可以對(duì)元素排序媚赖,用復(fù)雜度為n \log n的排序算法霜瘪,之后只需遍歷一次排序好的序列,計(jì)算相鄰元素的值惧磺,這種算法的復(fù)雜度是n\log n+nn\log n

def min_abs_diff(arr):
    arr = sorted(arr)
    ma = min(abs(x-y) for x,y in zip(arr, arr[1:]))
    return ma

(2020.12.26 Sat)
尋找最大油田捻撑。有一片土地磨隘,用二維矩陣表示,如果某個(gè)地點(diǎn)有石油顾患,則相應(yīng)的位置用1表示番捂,如果沒有石油則0.有石油的土地可能相鄰(上下左右),求一片土地上最大的連續(xù)油田江解。
分析:隨機(jī)檢測(cè)一塊土地(即矩陣中一點(diǎn))设预,該點(diǎn)有石油,則檢測(cè)其上下左右四個(gè)方向的點(diǎn)有無石油犁河,如果被檢測(cè)的點(diǎn)在之前已經(jīng)被訪問過鳖枕,則不檢測(cè)該點(diǎn)。直到遍歷整個(gè)矩陣后桨螺,找到連接面積最大的油田宾符。
在檢測(cè)過程中創(chuàng)建一個(gè)visited矩陣,記錄表示油田的矩陣中對(duì)應(yīng)的點(diǎn)是否被訪問過灭翔。

def dfs(i,j):
    if i >= 0 and i < row and j >= 0 and j < col and visited[i][j] == None and oil_field[i][j] == 1:
        visited[i][j] = 1
        print('i: ',i,', j: ',j)
        return 1 + dfs(i-1,j) + dfs(i+1,j) + dfs(i,j+1) + dfs(i,j-1)
    else:
        return 0

if __name__ == '__main__':
    oil_field = [ [1, 0, 0, 1, 0, 1, 0], \
                  [0, 1, 1, 1, 0, 1, 0], \
                  [1, 0, 1, 0, 1, 0, 1], \
                  [0, 1, 0, 0, 1, 0, 1], \
                  [1, 1, 1, 0, 1, 0, 1], \
                  [0, 0, 1, 0, 0, 1, 0], \
                  [0, 0, 1, 0, 0, 1, 1], \
                  [1, 1, 1, 1, 1, 1, 1]]
    row, col = len(oil_field), len(oil_field[0])
    visited = [ [None for i in range(col)] for j in range(row)]
    maxof = 0
    for r in range(len(oil_field)):
        for c in range(len(oil_field[0])):
            tmp = dfs(r, c)
            if maxof > tmp:
                continue
            else:
                maxof = tmp
    print(maxof)

(2020.12.27 Sun)
艱難旅行:現(xiàn)已知一個(gè)大小為 N · M 的地圖魏烫,地圖中只有可能出現(xiàn)兩個(gè)數(shù)字:0 或 1,現(xiàn)規(guī)定如果位于數(shù)字為 0 的格子上,則下一步只能往相鄰四個(gè)格子中數(shù)字為 1 的格子走哄褒,如果位于數(shù)字為 1 的格子上稀蟋,則下一步只能往相鄰四個(gè)格子中數(shù)字為 0 的格子走。如果給定起點(diǎn)格子呐赡,則可以向上下左右四個(gè)方向移動(dòng)退客,且同一個(gè)格子不能重復(fù)走,求能在地圖中到達(dá)多少格子罚舱?

1 2 3 4
1 1 0 1 1
2 1 0 1 0
3 0 1 0 1
4 0 0 1 1

比如在上面的案例中以第3行第3列的0為起點(diǎn)井辜,可以到達(dá)上下左右的四個(gè)點(diǎn),因?yàn)檫@四點(diǎn)的值都為1管闷,其中的第3行第2列的1又可以到達(dá)上下左三點(diǎn)粥脚,因?yàn)檫@三點(diǎn)的值與1不同,以此類推包个。
分析:這種類型可以通過圖的BFS來解決刷允。需要visited矩陣記錄某個(gè)點(diǎn)是否被訪問過,也需要判斷即將被訪問的點(diǎn)是否可當(dāng)前點(diǎn)的值不同碧囊。

def find_neighbours(tmp, data):
    # tmp = (a,b), the index
    row, col =  len(data), len(data[0])
    results = set()
    if 0 <= tmp[0] + 1 < row:
        results.add((tmp[0]+1, tmp[1]))
    if row > tmp[0] - 1 >= 0:
        results.add((tmp[0] - 1, tmp[1]))
    if 0 <= tmp[1]+1 < col:
        results.add((tmp[0], tmp[1] + 1))
    if col > tmp[1]-1 >= 0:
        results.add((tmp[0], tmp[1] - 1))
    return results

if __name__ == '__main__':
    from collections import deque
    import pdb
    data = [ [1, 0, 1, 1, 0],\
             [1, 0, 1, 0, 1],\
             [0, 1, 0, 1, 0],\
             [0, 0, 1, 1, 1] ]
    start_ = (2, 1)
    visited = [[None for i in range(len(data[0]))] for j in range(len(data))]
    q = deque()
    q.append(start_)
    visited[start_[0]][start_[1]] = 1 #注意visited修改的位置树灶,是append之后
    cntr = 0
    result = []
    while q.__len__() != 0:
        tmp = q.popleft()
        cntr += 1
        result.append(tmp)
        neighbours = find_neighbours(tmp, data)
        for n in neighbours:
            if visited[n[0]][n[1]] == None and data[n[0]][n[1]] != data[tmp[0]][tmp[1]]:
                q.append(n)
                visited[n[0]][n[1]] = 1 #append之后即修改visited
    print('cntr: ', cntr)
    print(result)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市糯而,隨后出現(xiàn)的幾起案子天通,更是在濱河造成了極大的恐慌,老刑警劉巖熄驼,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件像寒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瓜贾,警方通過查閱死者的電腦和手機(jī)诺祸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祭芦,“玉大人筷笨,你說我怎么就攤上這事」昃ⅲ” “怎么了胃夏?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咸灿。 經(jīng)常有香客問我构订,道長(zhǎng),這世上最難降的妖魔是什么避矢? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任悼瘾,我火速辦了婚禮囊榜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亥宿。我一直安慰自己卸勺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布烫扼。 她就那樣靜靜地躺著曙求,像睡著了一般。 火紅的嫁衣襯著肌膚如雪映企。 梳的紋絲不亂的頭發(fā)上悟狱,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音堰氓,去河邊找鬼挤渐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛双絮,可吹牛的內(nèi)容都是我干的浴麻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼囤攀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼软免!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起焚挠,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤膏萧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝌衔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向抢,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年胚委,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉信。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亩冬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硼身,到底是詐尸還是另有隱情硅急,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布佳遂,位于F島的核電站营袜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丑罪。R本人自食惡果不足惜荚板,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一凤壁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跪另,春花似錦拧抖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄涩。三九已至,卻和暖如春淌哟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辽故。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工徒仓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榕暇。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓蓬衡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親彤枢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狰晚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容