字节跳动2019春招研发部分编程题汇总(Python版本)
一、萬萬沒想到之聰明的編輯
王大錘是一家出版社的編輯,負責校對投稿來的英文稿件,他發現一個發現拼寫錯誤的捷徑:
請實現大錘的自動校對程序
輸入描述:
第一行包括一個數字N,表示本次用例包括多少個待校驗的字符串。后面跟隨N行,每行為一個待校驗的字符串。輸出描述:
N行,每行包括一個被修復后的字符串。輸入例子1:
2 helloo wooooooow輸出例子1:
hello woow題解:
每次取判斷是否連續出現3個相同和是否出現"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輸入一個整數,但是input()函數返回值是str型。需要這樣轉換:a=int(input(“請輸入一個整數”))(強制類型轉換,其他同理)或者用a=eval(input(“請輸入一個整數”))(自動類型轉換)
2、range(5)等價于range(0,5),是[0, 1, 2, 3, 4]沒有5
3、list() 方法用于將元組轉換為列表。
4、join() 方法用于將序列中的元素以指定的字符連接生成一個新的字符串。
二、萬萬沒想到之抓捕孔連順
王大錘是一名特工。剛剛接到任務抓捕恐怖分子孔連順。和他一起行動的還有另外兩名特工,他提議
給定N(可選作埋伏點的建筑物數)、D(相距最遠的兩名特工間的距離的最大值)以及可選建筑的坐標,計算在這次行動中,有多少種埋伏選擇。
注意:
輸入描述:
第一行包含空格分隔的兩個數字 N和D(1?≤?N?≤?1000000; 1?≤?D?≤?1000000)第二行包含N個建筑物的的位置,每個位置用一個整數(取值區間為[0, 1000000])表示, 從小到大排列(將字節跳動大街看做一條數軸)輸出描述:
一個數字,表示不同埋伏方案的數量。結果可能溢出,請對 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)題解:
設置兩個指針,i指針為第一個特工的下標,j指針為另外兩個特工最遠位置的下標,依次遍歷;根據排列組合,每個i指針對應的方案數為C(j-i,2),將所有方案數相加。
【注】
1、a, b,c= map(int, input().split(’,’)) #一行輸入多個用逗號隔開的數字,這里是輸入三個數字。
N = list(map(int, input().split())) #一行輸入多個空格隔開的數字,并以列表的形式存儲。
2、排列A(n,m)=n!/(n-m)!(n為下標,m為上標,以下同)
組合C(n,m)= n!/m!(n-m)!;
三、雀魂啟動!
小包最近發明了一種新的麻將,具體的規則如下:
總共有36張牌,每張牌是1~9。每個數字4張牌。
你手里有其中的14張牌,如果這14張牌滿足如下條件,即算作和牌
14張牌中有2張相同數字的牌,稱為雀頭。
除去上述2張牌,剩下12張牌可以組成4個順子或刻子。順子的意思是遞增的連續3個數字牌(例如234,567等),刻子的意思是相同數字的3個數字牌(例如111,777)
例如:
1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以組成1,2,6,7的4個刻子和9的雀頭,可以和牌
1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀頭,組123,123,567,789的四個順子,可以和牌
1 1 1 2 2 2 3 3 3 5 6 7 7 9 無論用1 2 3 7哪個做雀頭,都無法組成和牌的條件。
現在,小包從36張牌中抽取了13張牌,他想知道在剩下的23張牌中,再取一張牌,取到哪幾種數字牌可以和牌。
輸入描述:
輸入只有一行,包含13個數字,用空格分隔,每個數字在1~9之間 數據保證同種數字最多出現4次。輸出描述:
輸出同樣是一行,包含1個或以上的數字。代表他再取到哪些牌可以和牌。 若滿足條件的有多種牌,請按從小到大的順序輸出。若沒有滿足條件的牌,請輸出一個數字0輸入例子1:
1 1 1 2 2 2 5 5 5 6 6 6 9輸出例子1:
9例子說明1:
可以組成1,2,5,6的4個刻子和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的四個順子輸入例子3:
1 1 1 2 2 2 3 3 3 5 7 7 9輸出例子3:
0例子說明3:
來任何牌都無法和牌題解:
原理:如果該手牌胡牌,那么每個數字必然是,雀頭、刻子、順子的成員,
遞歸算法 : 從最小的數字開始嘗試,如果把其當成雀頭成員,該數字劃掉兩個,并看余下的數字能否劃空
如果是刻子成員,該數字劃掉三個,并查看余下數字能否劃空
如果是順子成員,劃掉該值a, a + 1, a + 2,并查看余下數字能否劃空
如果上述三種嘗試都無法劃空數組,說明存在數字無法是雀頭、刻子、順子的成員,
將一個數字牌補入13個牌之中,判斷是否和牌,是則輸出,不是則下一個數字牌
四、特征提取
小明是一名算法工程師,同時也是一名鏟屎官。某天,他突發奇想,想從貓咪的視頻里挖掘一些貓咪的運動信息。為了提取運動信息,他需要從視頻的每一幀提取“貓咪特征”。一個貓咪特征是一個兩維的vector<x, y>。如果x_1=x_2 and y_1=y_2,那么這倆是同一個特征。
因此,如果喵咪特征連續一致,可以認為喵咪在運動。也就是說,如果特征<a, b>在持續幀里出現,那么它將構成特征運動。比如,特征<a, b>在第2/3/4/7/8幀出現,那么該特征將形成兩個特征運動2-3-4 和7-8。
現在,給定每一幀的特征,特征的數量可能不一樣。小明期望能找到最長的特征運動。
輸入描述:
第一行包含一個正整數N,代表測試用例的個數。每個測試用例的第一行包含一個正整數M,代表視頻的幀數。接下來的M行,每行代表一幀。其中,第一個數字是該幀的特征個數,接下來的數字是在特征的取值;比如樣例輸入第三行里,2代表該幀有兩個貓咪特征,<1,1>和<2,2> 所有用例的輸入特征總數和<100000N滿足1≤N≤100000,M滿足1≤M≤10000,一幀的特征個數滿足 ≤ 10000。 特征取值均為非負整數。輸出描述:
對每一個測試用例,輸出特征運動的長度作為一行輸入例子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>在連續的幀中連續出現3次,相比其他特征連續出現的次數大,所以輸出3 n = int(input()) # n代表測試用例的個數 while n > 0: m = int(input()) # m代表視頻的幀數res = 1 #res代表最長特征運動的長度d = {} # 字典d記錄{貓咪的特征值(key),特征運動長度(特征值連續出現的次數)}for i in range(m):l = list(map(int , input().split())) # 每行代表一幀k = l[0] # 第一個數字是該幀的特征個數tmp_d = {}for j in range(k):index = l[2 * j + 1]* 10 + l[2 * j + 2] #兩個數字形成的特征值歸一化為indexif index in d: # 此特征值出現在了上一幀中tmp_d[index] = d[index] + 1res = max(res, tmp_d[index]) # 更新res即最長特征運動的長度else:tmp_d[index] = 1d = tmp_d #及時更新字典d的內容print(res)n -= 1五、畢業旅行問題
小明目前在做一份畢業旅行的規劃。打算從北京出發,分別去若干個城市,然后再回到北京,每個城市之間均乘坐高鐵,且每個城市只去一次。由于經費有限,希望能夠通過合理的路線安排盡可能的省一些路上的花銷。給定一組城市和每對城市之間的火車票的價錢,找到每個城市只訪問一次并返回起點的最小車費花銷。
輸入描述:
城市個數n(1<n≤20,包括北京)城市間的車票價錢 n行n列的矩陣 m[n][n]輸出描述:
最小車費花銷 s輸入例子1:
4 0 2 6 5 2 0 4 4 6 4 0 2 5 4 2 0輸出例子1:
13例子說明1:
共 4 個城市,城市 1 和城市 1 的車費為0,城市 1 和城市 2 之間的車費為 2, 城市 1 和城市 3 之間的車費為 6,城市 1 和城市 4 之間的車費為 5。 依次類推。假設任意兩個城市之間均有單程票可購買,且票價在1000元以內,無需考慮極端情況。 import itertools n = int(input()) #城市個數n(1<n≤20,包括北京) L = [] #城市間的車票價錢 n行n列的矩陣 [n][n] for i in range(n):L.append(list(map(int, input().split(' '))))def treaval(L, n):# 除起點之外的不同路線組合,假設起點為0號節點com = list(itertools.permutations(list(range(1, n)), n - 1)) #range函數返回的是一個可迭代對象,而不是列表類型, 所以打印的時候不會打印列表。spend = 9999 # 假設一開始花銷很大for j in range(len(com)): #len(com)是可選擇的路線種類數road = list(com.pop(0))# 獲取其中一種路線組合road列表之后就釋放,com是一個元組序列# 補全起點和終點(注意起點也是終點,形成閉環)此時road長度為n+1road.append(0)#在列表末尾添加新的對象road.insert(0, 0)#將對象插入列表x = 0 # 當前路線的花銷for i in range(n):x = x + L[road[i]][road[i + 1]]if x < spend:spend = x #更新最小花銷return spendprint(treaval(L, n))【注】
若想遍歷一個集合中元素的所有可能的排列或組合
itertools模塊提供了函數來解決這類問題。其中一個是itertools.permutations(),它接受一個集合并產生一個元組序列,每個元組由集合中所有元素的一個可能排列組成,也就是說通過打亂集合中元素排列順序生成一個元組。
items=[‘a’,‘b’,‘c’]
from itertools import permutations
for p in permutations(items):
print§
#若想得到指定長度的所有排列,你可以傳遞一個可選的長度參數
for p in permutations(items,2):
print§
六、找零
Z國的貨幣系統包含面值1元、4元、16元、64元共計4種硬幣,以及面值1024元的紙幣。現在小Y使用1024元的紙幣購買了一件價值為的商品,請問最少他會收到多少硬幣?
輸入描述:
一行,包含一個數N。輸出描述:
一行,包含一個數,表示最少收到的硬幣數。輸入例子1:
200輸出例子1:
17例子說明1:
花200,需要找零824塊,找12個64元硬幣,3個16元硬幣,2個4元硬幣即可。 lyst = [64, 16, 4, 1] #硬幣列表(從大到小排列) cost = 1024 - int(input()) res = 0 #最少得到的硬幣數量 for i in lyst:res += cost//i #取整除 - 返回商的整數部分(向下取整)cost %= i #取模 - 返回除法的余數 print(res)七、機器人跳躍問題
機器人正在玩一個古老的基于DOS的游戲。游戲中有N+1座建筑——從0到N編號,從左到右排列。編號為0的建筑高度為0個單位,編號為i的建筑的高度為H(i)個單位。
起初, 機器人在編號為0的建筑處。每一步,它跳到下一個(右邊)建筑。假設機器人在第k個建筑,且它現在的能量值是E, 下一步它將跳到第個k+1建筑。它將會得到或者失去正比于與H(k+1)與E之差的能量。如果 H(k+1) > E 那么機器人就失去 H(k+1) - E 的能量值,否則它將得到 E - H(k+1) 的能量值。
游戲目標是到達第個N建筑,在這個過程中,能量值不能為負數個單位。現在的問題是機器人以多少能量值開始游戲,才可以保證成功完成游戲?
輸入描述:
第一行輸入,表示一共有 N 組數據.第二個是 N 個空格分隔的整數,H1, H2, H3, ..., Hn 代表建筑物的高度輸出描述:
輸出一個單獨的數表示完成游戲所需的最少單位的初始能量輸入例子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(''))) # 假設跳躍前能力為E,要跳的高度為H,那么跳躍后的能量就是E-(H-E)=2E-H, # 那么跳躍后的能量加上高度就是跳躍前的兩倍,然后從后往前逆推。 E = 0 # 跳到最后一步的能力值設為0 arr.reverse()#翻轉列表逆推 for H in arr:E = math.ceil((E + H ) / 2) #向上取整,以此保證剩余能量大于等于0 print(E)總結
以上是生活随笔為你收集整理的字节跳动2019春招研发部分编程题汇总(Python版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片清晰化软件
- 下一篇: Word处理控件Aspose.Words