日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

字节跳动2019春招研发部分编程题汇总(Python版本)

發(fā)布時(shí)間:2024/3/24 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节跳动2019春招研发部分编程题汇总(Python版本) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、萬萬沒想到之聰明的編輯

王大錘是一家出版社的編輯,負(fù)責(zé)校對(duì)投稿來的英文稿件,他發(fā)現(xiàn)一個(gè)發(fā)現(xiàn)拼寫錯(cuò)誤的捷徑:

  • 三個(gè)同樣的字母連在一起,一定是拼寫錯(cuò)誤,去掉一個(gè)的就好啦:比如 helllo -> hello
  • 兩對(duì)一樣的字母(AABB型)連在一起,一定是拼寫錯(cuò)誤,去掉第二對(duì)的一個(gè)字母就好啦:比如 helloo -> hello
  • 上面的規(guī)則優(yōu)先“從左到右”匹配,即如果是AABBCC,雖然AABB和BBCC都是錯(cuò)誤拼寫,應(yīng)該優(yōu)先考慮修復(fù)AABB,結(jié)果為AABCC
  • 請(qǐng)實(shí)現(xiàn)大錘的自動(dòng)校對(duì)程序

    輸入描述:

    第一行包括一個(gè)數(shù)字N,表示本次用例包括多少個(gè)待校驗(yàn)的字符串。后面跟隨N行,每行為一個(gè)待校驗(yàn)的字符串。

    輸出描述:

    N行,每行包括一個(gè)被修復(fù)后的字符串。

    輸入例子1:

    2 helloo wooooooow

    輸出例子1:

    hello woow

    題解:

    每次取判斷是否連續(xù)出現(xiàn)3個(gè)相同和是否出現(xiàn)"AABB"的形式即可。

    n=int(input()) for i in range(n):s=list(input())k=0for j in range(len(s)):s[k]=s[j]k+=1if k>=3 and s[k-3]==s[k-2] and s[k-2]==s[k-1]:k-=1 if k>=4 and s[k-4]==s[k-3] and s[k-2]==s[k-1]:k-=1 print(''.join(s[:k]))

    【注】
    1、使用python想用input輸入一個(gè)整數(shù),但是input()函數(shù)返回值是str型。需要這樣轉(zhuǎn)換:a=int(input(“請(qǐng)輸入一個(gè)整數(shù)”))(強(qiáng)制類型轉(zhuǎn)換,其他同理)或者用a=eval(input(“請(qǐng)輸入一個(gè)整數(shù)”))(自動(dòng)類型轉(zhuǎn)換)
    2、range(5)等價(jià)于range(0,5),是[0, 1, 2, 3, 4]沒有5
    3、list() 方法用于將元組轉(zhuǎn)換為列表。
    4、join() 方法用于將序列中的元素以指定的字符連接生成一個(gè)新的字符串。

    二、萬萬沒想到之抓捕孔連順

    王大錘是一名特工。剛剛接到任務(wù)抓捕恐怖分子孔連順。和他一起行動(dòng)的還有另外兩名特工,他提議

  • 在大街的N個(gè)建筑中選定3個(gè)埋伏地點(diǎn)。
  • 為了相互照應(yīng),相距最遠(yuǎn)的兩名特工間的距離不超過D。
  • 給定N(可選作埋伏點(diǎn)的建筑物數(shù))、D(相距最遠(yuǎn)的兩名特工間的距離的最大值)以及可選建筑的坐標(biāo),計(jì)算在這次行動(dòng)中,有多少種埋伏選擇。
    注意:

  • 兩個(gè)特工不能埋伏在同一地點(diǎn)
  • 三個(gè)特工是等價(jià)的:即同樣的位置組合(A, B, C) 只算一種埋伏方法,不能因“特工之間互換位置”而重復(fù)使用
  • 輸入描述:

    第一行包含空格分隔的兩個(gè)數(shù)字 N和D(1?≤?N?≤?1000000; 1?≤?D?≤?1000000)第二行包含N個(gè)建筑物的的位置,每個(gè)位置用一個(gè)整數(shù)(取值區(qū)間為[0, 1000000])表示, 從小到大排列(將字節(jié)跳動(dòng)大街看做一條數(shù)軸)

    輸出描述:

    一個(gè)數(shù)字,表示不同埋伏方案的數(shù)量。結(jié)果可能溢出,請(qǐng)對(duì) 99997867 取模

    輸入例子1:

    4 3 1 2 3 4

    輸出例子1:

    4

    例子說明1:

    可選方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)

    輸入例子2:

    5 19 1 10 20 30 50

    輸出例子2:

    1

    例子說明2:

    可選方案 (1, 10, 20)

    題解:
    設(shè)置兩個(gè)指針,i指針為第一個(gè)特工的下標(biāo),j指針為另外兩個(gè)特工最遠(yuǎn)位置的下標(biāo),依次遍歷;根據(jù)排列組合,每個(gè)i指針對(duì)應(yīng)的方案數(shù)為C(j-i,2),將所有方案數(shù)相加。

    n, dist = map(int, input().split()) #n是建筑物數(shù)目,dist是兩個(gè)特工相距的最大距離 nums = list(map(int, input().split())) #列表nums存儲(chǔ)所有建筑物的坐標(biāo)(橫軸) res = 0 #res埋伏方案數(shù)目 i = 0 #i為第一個(gè)特工的下標(biāo) j = 2 #j為另外兩個(gè)特工最遠(yuǎn)位置的下標(biāo),因?yàn)橛腥齻€(gè)特工,所以j的下標(biāo)從2開始 while i < n-2:while j < n and nums[j] - nums[i] <= dist: #符合埋伏條件,繼續(xù)搜尋j += 1 #最后一次時(shí)會(huì)使j多加一次if j - 1 - i >= 2:num = j - i - 1 #num為C的底數(shù)res += num * (num - 1) // 2 #排列組合C(num,2)=num!/(num-2)!*2!i += 1 res= res%99997867 print(res)

    【注】
    1、a, b,c= map(int, input().split(’,’)) #一行輸入多個(gè)用逗號(hào)隔開的數(shù)字,這里是輸入三個(gè)數(shù)字。
    N = list(map(int, input().split())) #一行輸入多個(gè)空格隔開的數(shù)字,并以列表的形式存儲(chǔ)。
    2、排列A(n,m)=n!/(n-m)!(n為下標(biāo),m為上標(biāo),以下同)
    組合C(n,m)= n!/m!(n-m)!;

    三、雀魂啟動(dòng)!

    小包最近發(fā)明了一種新的麻將,具體的規(guī)則如下:

    總共有36張牌,每張牌是1~9。每個(gè)數(shù)字4張牌。
    你手里有其中的14張牌,如果這14張牌滿足如下條件,即算作和牌
    14張牌中有2張相同數(shù)字的牌,稱為雀頭。
    除去上述2張牌,剩下12張牌可以組成4個(gè)順子或刻子。順子的意思是遞增的連續(xù)3個(gè)數(shù)字牌(例如234,567等),刻子的意思是相同數(shù)字的3個(gè)數(shù)字牌(例如111,777)

    例如:
    1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以組成1,2,6,7的4個(gè)刻子和9的雀頭,可以和牌
    1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀頭,組123,123,567,789的四個(gè)順子,可以和牌
    1 1 1 2 2 2 3 3 3 5 6 7 7 9 無論用1 2 3 7哪個(gè)做雀頭,都無法組成和牌的條件。

    現(xiàn)在,小包從36張牌中抽取了13張牌,他想知道在剩下的23張牌中,再取一張牌,取到哪幾種數(shù)字牌可以和牌。

    輸入描述:

    輸入只有一行,包含13個(gè)數(shù)字,用空格分隔,每個(gè)數(shù)字在1~9之間 數(shù)據(jù)保證同種數(shù)字最多出現(xiàn)4次。

    輸出描述:

    輸出同樣是一行,包含1個(gè)或以上的數(shù)字。代表他再取到哪些牌可以和牌。 若滿足條件的有多種牌,請(qǐng)按從小到大的順序輸出。若沒有滿足條件的牌,請(qǐng)輸出一個(gè)數(shù)字0

    輸入例子1:

    1 1 1 2 2 2 5 5 5 6 6 6 9

    輸出例子1:

    9

    例子說明1:

    可以組成1,2,5,6的4個(gè)刻子和9的雀頭

    輸入例子2:

    1 1 1 1 2 2 3 3 5 6 7 8 9

    輸出例子2:

    4 7

    例子說明2:

    用1做雀頭,組123,123,567或456,789的四個(gè)順子

    輸入例子3:

    1 1 1 2 2 2 3 3 3 5 7 7 9

    輸出例子3:

    0

    例子說明3:

    來任何牌都無法和牌

    題解:
    原理:如果該手牌胡牌,那么每個(gè)數(shù)字必然是,雀頭、刻子、順子的成員,
    遞歸算法 : 從最小的數(shù)字開始嘗試,如果把其當(dāng)成雀頭成員,該數(shù)字劃掉兩個(gè),并看余下的數(shù)字能否劃空
    如果是刻子成員,該數(shù)字劃掉三個(gè),并查看余下數(shù)字能否劃空
    如果是順子成員,劃掉該值a, a + 1, a + 2,并查看余下數(shù)字能否劃空
    如果上述三種嘗試都無法劃空數(shù)組,說明存在數(shù)字無法是雀頭、刻子、順子的成員,
    將一個(gè)數(shù)字牌補(bǔ)入13個(gè)牌之中,判斷是否和牌,是則輸出,不是則下一個(gè)數(shù)字牌

    def IShepai(str):lenth=len(str)#能否劃空if lenth == 0:return Truecount1=str.count(str[0])# 沒出現(xiàn)過雀頭,且第一個(gè)數(shù)字出現(xiàn)的次數(shù) >= 2,去掉雀頭剩下的能不能和牌if lenth%3!=0 and count1>=2 and IShepai(str[2:])==True:return True# 如果第一個(gè)數(shù)字出現(xiàn)次數(shù) >= 3,去掉這個(gè)刻子后看剩下的能和牌if count1 >= 3 and IShepai(str[3:])==True:return True# 如果存在順子,移除順子后剩下的能和牌if str[0] + 1 in str and str[0] + 2 in str:str1 = str[1:]str1.remove(str[0]+1)str1.remove(str[0]+2)if IShepai(str1) == True:return True# 以上條件都不滿足,則不能和牌return Falseif __name__ == '__main__':a=list(map(int, input().split()))flag=0#遍歷所有可以抓到的牌看能不能胡牌for i in range(1,10):al=sorted(a + [i])#每個(gè)數(shù)字最多4張牌if al.count(i)>4:continueelse:if IShepai(al) == True:flag=1print(i,end=" ")if flag==0:print(0)

    四、特征提取

    小明是一名算法工程師,同時(shí)也是一名鏟屎官。某天,他突發(fā)奇想,想從貓咪的視頻里挖掘一些貓咪的運(yùn)動(dòng)信息。為了提取運(yùn)動(dòng)信息,他需要從視頻的每一幀提取“貓咪特征”。一個(gè)貓咪特征是一個(gè)兩維的vector<x, y>。如果x_1=x_2 and y_1=y_2,那么這倆是同一個(gè)特征。
    因此,如果喵咪特征連續(xù)一致,可以認(rèn)為喵咪在運(yùn)動(dòng)。也就是說,如果特征<a, b>在持續(xù)幀里出現(xiàn),那么它將構(gòu)成特征運(yùn)動(dòng)。比如,特征<a, b>在第2/3/4/7/8幀出現(xiàn),那么該特征將形成兩個(gè)特征運(yùn)動(dòng)2-3-4 和7-8。
    現(xiàn)在,給定每一幀的特征,特征的數(shù)量可能不一樣。小明期望能找到最長(zhǎng)的特征運(yùn)動(dòng)。

    輸入描述:

    第一行包含一個(gè)正整數(shù)N,代表測(cè)試用例的個(gè)數(shù)。每個(gè)測(cè)試用例的第一行包含一個(gè)正整數(shù)M,代表視頻的幀數(shù)。接下來的M行,每行代表一幀。其中,第一個(gè)數(shù)字是該幀的特征個(gè)數(shù),接下來的數(shù)字是在特征的取值;比如樣例輸入第三行里,2代表該幀有兩個(gè)貓咪特征,<1,1>和<2,2> 所有用例的輸入特征總數(shù)和<100000N滿足1≤N≤100000,M滿足1≤M≤10000,一幀的特征個(gè)數(shù)滿足 ≤ 10000。 特征取值均為非負(fù)整數(shù)。

    輸出描述:

    對(duì)每一個(gè)測(cè)試用例,輸出特征運(yùn)動(dòng)的長(zhǎng)度作為一行

    輸入例子1:

    1 8 2 1 1 2 2 2 1 1 1 4 2 1 1 2 2 2 2 2 1 4 0 0 1 1 1 1 1 1

    輸出例子1:

    3

    例子說明1:

    特征<1,1>在連續(xù)的幀中連續(xù)出現(xiàn)3次,相比其他特征連續(xù)出現(xiàn)的次數(shù)大,所以輸出3 n = int(input()) # n代表測(cè)試用例的個(gè)數(shù) while n > 0: m = int(input()) # m代表視頻的幀數(shù)res = 1 #res代表最長(zhǎng)特征運(yùn)動(dòng)的長(zhǎng)度d = {} # 字典d記錄{貓咪的特征值(key),特征運(yùn)動(dòng)長(zhǎng)度(特征值連續(xù)出現(xiàn)的次數(shù))}for i in range(m):l = list(map(int , input().split())) # 每行代表一幀k = l[0] # 第一個(gè)數(shù)字是該幀的特征個(gè)數(shù)tmp_d = {}for j in range(k):index = l[2 * j + 1]* 10 + l[2 * j + 2] #兩個(gè)數(shù)字形成的特征值歸一化為indexif index in d: # 此特征值出現(xiàn)在了上一幀中tmp_d[index] = d[index] + 1res = max(res, tmp_d[index]) # 更新res即最長(zhǎng)特征運(yùn)動(dòng)的長(zhǎng)度else:tmp_d[index] = 1d = tmp_d #及時(shí)更新字典d的內(nèi)容print(res)n -= 1

    五、畢業(yè)旅行問題

    小明目前在做一份畢業(yè)旅行的規(guī)劃。打算從北京出發(fā),分別去若干個(gè)城市,然后再回到北京,每個(gè)城市之間均乘坐高鐵,且每個(gè)城市只去一次。由于經(jīng)費(fèi)有限,希望能夠通過合理的路線安排盡可能的省一些路上的花銷。給定一組城市和每對(duì)城市之間的火車票的價(jià)錢,找到每個(gè)城市只訪問一次并返回起點(diǎn)的最小車費(fèi)花銷。

    輸入描述:

    城市個(gè)數(shù)n(1<n≤20,包括北京)城市間的車票價(jià)錢 n行n列的矩陣 m[n][n]

    輸出描述:

    最小車費(fèi)花銷 s

    輸入例子1:

    4 0 2 6 5 2 0 4 4 6 4 0 2 5 4 2 0

    輸出例子1:

    13

    例子說明1:

    共 4 個(gè)城市,城市 1 和城市 1 的車費(fèi)為0,城市 1 和城市 2 之間的車費(fèi)為 2, 城市 1 和城市 3 之間的車費(fèi)為 6,城市 1 和城市 4 之間的車費(fèi)為 5。 依次類推。假設(shè)任意兩個(gè)城市之間均有單程票可購買,且票價(jià)在1000元以內(nèi),無需考慮極端情況。 import itertools n = int(input()) #城市個(gè)數(shù)n(1<n≤20,包括北京) L = [] #城市間的車票價(jià)錢 n行n列的矩陣 [n][n] for i in range(n):L.append(list(map(int, input().split(' '))))def treaval(L, n):# 除起點(diǎn)之外的不同路線組合,假設(shè)起點(diǎn)為0號(hào)節(jié)點(diǎn)com = list(itertools.permutations(list(range(1, n)), n - 1)) #range函數(shù)返回的是一個(gè)可迭代對(duì)象,而不是列表類型, 所以打印的時(shí)候不會(huì)打印列表。spend = 9999 # 假設(shè)一開始花銷很大for j in range(len(com)): #len(com)是可選擇的路線種類數(shù)road = list(com.pop(0))# 獲取其中一種路線組合road列表之后就釋放,com是一個(gè)元組序列# 補(bǔ)全起點(diǎn)和終點(diǎn)(注意起點(diǎn)也是終點(diǎn),形成閉環(huán))此時(shí)road長(zhǎng)度為n+1road.append(0)#在列表末尾添加新的對(duì)象road.insert(0, 0)#將對(duì)象插入列表x = 0 # 當(dāng)前路線的花銷for i in range(n):x = x + L[road[i]][road[i + 1]]if x < spend:spend = x #更新最小花銷return spendprint(treaval(L, n))

    【注】

    若想遍歷一個(gè)集合中元素的所有可能的排列或組合
    itertools模塊提供了函數(shù)來解決這類問題。其中一個(gè)是itertools.permutations(),它接受一個(gè)集合并產(chǎn)生一個(gè)元組序列,每個(gè)元組由集合中所有元素的一個(gè)可能排列組成,也就是說通過打亂集合中元素排列順序生成一個(gè)元組。
    items=[‘a(chǎn)’,‘b’,‘c’]
    from itertools import permutations
    for p in permutations(items):
    print§

    #若想得到指定長(zhǎng)度的所有排列,你可以傳遞一個(gè)可選的長(zhǎng)度參數(shù)
    for p in permutations(items,2):
    print§

    六、找零

    Z國(guó)的貨幣系統(tǒng)包含面值1元、4元、16元、64元共計(jì)4種硬幣,以及面值1024元的紙幣。現(xiàn)在小Y使用1024元的紙幣購買了一件價(jià)值為的商品,請(qǐng)問最少他會(huì)收到多少硬幣?

    輸入描述:

    一行,包含一個(gè)數(shù)N。

    輸出描述:

    一行,包含一個(gè)數(shù),表示最少收到的硬幣數(shù)。

    輸入例子1:

    200

    輸出例子1:

    17

    例子說明1:

    花200,需要找零824塊,找12個(gè)64元硬幣,3個(gè)16元硬幣,2個(gè)4元硬幣即可。 lyst = [64, 16, 4, 1] #硬幣列表(從大到小排列) cost = 1024 - int(input()) res = 0 #最少得到的硬幣數(shù)量 for i in lyst:res += cost//i #取整除 - 返回商的整數(shù)部分(向下取整)cost %= i #取模 - 返回除法的余數(shù) print(res)

    七、機(jī)器人跳躍問題

    機(jī)器人正在玩一個(gè)古老的基于DOS的游戲。游戲中有N+1座建筑——從0到N編號(hào),從左到右排列。編號(hào)為0的建筑高度為0個(gè)單位,編號(hào)為i的建筑的高度為H(i)個(gè)單位。

    起初, 機(jī)器人在編號(hào)為0的建筑處。每一步,它跳到下一個(gè)(右邊)建筑。假設(shè)機(jī)器人在第k個(gè)建筑,且它現(xiàn)在的能量值是E, 下一步它將跳到第個(gè)k+1建筑。它將會(huì)得到或者失去正比于與H(k+1)與E之差的能量。如果 H(k+1) > E 那么機(jī)器人就失去 H(k+1) - E 的能量值,否則它將得到 E - H(k+1) 的能量值。

    游戲目標(biāo)是到達(dá)第個(gè)N建筑,在這個(gè)過程中,能量值不能為負(fù)數(shù)個(gè)單位。現(xiàn)在的問題是機(jī)器人以多少能量值開始游戲,才可以保證成功完成游戲?

    輸入描述:

    第一行輸入,表示一共有 N 組數(shù)據(jù).第二個(gè)是 N 個(gè)空格分隔的整數(shù),H1, H2, H3, ..., Hn 代表建筑物的高度

    輸出描述:

    輸出一個(gè)單獨(dú)的數(shù)表示完成游戲所需的最少單位的初始能量

    輸入例子1:

    5 3 4 3 2 4

    輸出例子1:

    4

    輸入例子2:

    3 4 4 4

    輸出例子2:

    4

    輸入例子3:

    3 1 6 4

    輸出例子3:

    3 import math input() arr = list(map(int, input().split(''))) # 假設(shè)跳躍前能力為E,要跳的高度為H,那么跳躍后的能量就是E-(H-E)=2E-H, # 那么跳躍后的能量加上高度就是跳躍前的兩倍,然后從后往前逆推。 E = 0 # 跳到最后一步的能力值設(shè)為0 arr.reverse()#翻轉(zhuǎn)列表逆推 for H in arr:E = math.ceil((E + H ) / 2) #向上取整,以此保證剩余能量大于等于0 print(E)

    總結(jié)

    以上是生活随笔為你收集整理的字节跳动2019春招研发部分编程题汇总(Python版本)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。