字节跳动2019春招研发部分编程题汇总(Python版本)
一、萬萬沒想到之聰明的編輯
王大錘是一家出版社的編輯,負(fù)責(zé)校對(duì)投稿來的英文稿件,他發(fā)現(xiàn)一個(gè)發(fā)現(xiàn)拼寫錯(cuò)誤的捷徑:
請(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(可選作埋伏點(diǎn)的建筑物數(shù))、D(相距最遠(yuǎn)的兩名特工間的距離的最大值)以及可選建筑的坐標(biāo),計(jì)算在這次行動(dòng)中,有多少種埋伏選擇。
注意:
輸入描述:
第一行包含空格分隔的兩個(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ù)相加。
【注】
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ù)字牌
四、特征提取
小明是一名算法工程師,同時(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片清晰化软件
- 下一篇: Word处理控件Aspose.Words