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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

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

王大錘是一家出版社的編輯,負責校對投稿來的英文稿件,他發現一個發現拼寫錯誤的捷徑:

  • 三個同樣的字母連在一起,一定是拼寫錯誤,去掉一個的就好啦:比如 helllo -> hello
  • 兩對一樣的字母(AABB型)連在一起,一定是拼寫錯誤,去掉第二對的一個字母就好啦:比如 helloo -> hello
  • 上面的規則優先“從左到右”匹配,即如果是AABBCC,雖然AABB和BBCC都是錯誤拼寫,應該優先考慮修復AABB,結果為AABCC
  • 請實現大錘的自動校對程序

    輸入描述:

    第一行包括一個數字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個建筑中選定3個埋伏地點。
  • 為了相互照應,相距最遠的兩名特工間的距離不超過D。
  • 給定N(可選作埋伏點的建筑物數)、D(相距最遠的兩名特工間的距離的最大值)以及可選建筑的坐標,計算在這次行動中,有多少種埋伏選擇。
    注意:

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

    第一行包含空格分隔的兩個數字 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),將所有方案數相加。

    n, dist = map(int, input().split()) #n是建筑物數目,dist是兩個特工相距的最大距離 nums = list(map(int, input().split())) #列表nums存儲所有建筑物的坐標(橫軸) res = 0 #res埋伏方案數目 i = 0 #i為第一個特工的下標 j = 2 #j為另外兩個特工最遠位置的下標,因為有三個特工,所以j的下標從2開始 while i < n-2:while j < n and nums[j] - nums[i] <= dist: #符合埋伏條件,繼續搜尋j += 1 #最后一次時會使j多加一次if j - 1 - i >= 2:num = j - i - 1 #num為C的底數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(’,’)) #一行輸入多個用逗號隔開的數字,這里是輸入三個數字。
    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個牌之中,判斷是否和牌,是則輸出,不是則下一個數字牌

    def IShepai(str):lenth=len(str)#能否劃空if lenth == 0:return Truecount1=str.count(str[0])# 沒出現過雀頭,且第一個數字出現的次數 >= 2,去掉雀頭剩下的能不能和牌if lenth%3!=0 and count1>=2 and IShepai(str[2:])==True:return True# 如果第一個數字出現次數 >= 3,去掉這個刻子后看剩下的能和牌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])#每個數字最多4張牌if al.count(i)>4:continueelse:if IShepai(al) == True:flag=1print(i,end=" ")if flag==0:print(0)

    四、特征提取

    小明是一名算法工程師,同時也是一名鏟屎官。某天,他突發奇想,想從貓咪的視頻里挖掘一些貓咪的運動信息。為了提取運動信息,他需要從視頻的每一幀提取“貓咪特征”。一個貓咪特征是一個兩維的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版本)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。