三道頭條的演算法筆試題

2021-09-23 14:31:57 字數 3849 閱讀 9931

【例1】

給出乙個長度為n的陣列a1、a2、…、an,請找出在所有連續區間中,區間和最大同時這個區間0的個數小於等於3個,輸出這個區間和。

輸入:第一行乙個正整數n,表示陣列長度,1 <= n <= 1000000。

​ 第二行為n個正整數a1 a2 … an,其中-1e9 <= a1,a2,…,an <= 1e9

輸出:乙個整數

樣例:輸入1: 5

1 2 3 4 5

輸出1: 15

輸入2: 6

15 0 0 0 0 20

輸出2: 20

python實現

n = int(input())

nums =

for i in range(0,n):

total = [0,0,0]

zero_pos = [-1,-1,-1]

zero_seq = 0

max_ = 0

for i in range(0,n):

if 0 == nums[i]:

if zero_seq < 2:

zero_seq += 1

else:

if sum(total) > max_:

max_ = sum(total)

temp = total[1:3]

total = temp

else:

total[zero_seq] += nums[i]

if sum(total) > max_:

max_ = sum(total)

print(max_)

go實現

package main

import "fmt"

func main()

total := int

zero_index := 0

max := 0

for i := 0; i < n; i++ else

}} else

} sum := total[0] + total[1] + total[2]

if sum > max

fmt.println(max)

}

【例2】

給定乙個n * m 矩陣 a,矩陣中每個位置 aij 為乙個 16 進製數。

尋找一條從左上角到右下角的路徑,每次只能向右或者向下移動,使得路徑上所有數字之積在16進製制下的字尾0最少。

輸入:第一行: n, m (2 <= n, m <= 1000)

接下來 n 行, 每行 m 個16進製制整數, 0 < aij < 10^9

輸出:第一行:最少字尾0的個數 (10進製)

第二行:路徑方案, 從左上角開始, > 代表向右移動,v 代表向下移動。如果有多種方案,輸出字典序最小的方案。

樣例輸入:

3 33 2 8

c 8 8

2 a f

樣例輸出:

1>>vv

實現

s = input().split()

n = int(s[0])

m = int(s[1])

import itertools

print

a =

for i in range(0,n):

row =

s = input().split()

for j in range(0,len(s)):

comb_origin =

for i in range(0,n+m-2):

comb = list(itertools.combinations(comb_origin,m-1)) #右轉

best_zeros_nums = -1

best_str = ""

for item in comb:

str = ""

i = 0

j = 0

total = a[i][j]

for seq in range(0, n+m-2):

if seq in item:

str += ">"

j += 1

else:

str += 'v'

i += 1

total = total*a[i][j]

zeros_nums = 0

total_hex = str(hex(total))

for i in range(len(total_hex)-1, -1, -1):

if total_hex[i] == '0':

zeros_nums += 1

else:

break

if zeros_nums < best_zeros_nums or best_zeros_nums == -1:

best_zeros_nums = zeros_nums

best_str = str

print(best_zeros_nums)

print(best_str)

點評

××input多個數字時,用 input().split()

××排列組合用庫itertools.combinations(list, num)

××如果是要排列位置的話,小技巧是,list用乙個順序排列的陣列 [0,1,2,3,4…] 這樣最後得到的組合結果就是指位置了

××將字串按照16進製制格式轉換為int是 int(str, 16)

××將整數轉換為16進製制字串 str(hex(int))

××for 倒序迴圈 i in range(倒序起始點, 倒序終止點, -1) 其中,是開閉區間的,-1是步長

【例3】

給定n個整數組成的序列,現在要求將序列分割為m段,每段子序列中的數在原序列中連續排列。如何分割才能使這m段子序列的和的最大值達到最小?

輸入第一行輸入乙個整數t,代表有t組測試資料。

每組資料第一行為兩個整數n,m分別代表序列的長度和最多可分的段數。

接下來一行包含n個整數表示序列。

0<=n<=50000 1<=m<=n,0<=ai<=2^30。

輸出輸出乙個整數表示和最大的一段的最小值。

t = int(input())

a =

m =

for i in range(0, t):

temp = input().split()

n = int(temp[0])

m_i = int(temp[1])

temp = input().split()

a_i =

for j in range(0,len(temp)):

for id in range(0, t):

a_i = a[id]

m_i = m[id]

n_i = len(a_i)

dp = [[0 for i in range(0,m_i)] for j in range(0,n_i)]

dp[0][0] = a_i[0]

for i in range(1,n_i):

dp[i][0] = dp[i-1][0] + a_i[i]

for j in range(1,m_i):

for i in range(0,n_i):

minv = -1

for k in range(0,i):

temp = max(dp[i][0]-dp[k][0], dp[k][j-1])

if minv == -1 or temp < minv:

minv = temp

dp[i][j] = minv

print(dp[n_i-1][m_i-1])

一道筆試題的思考(三)

題目 隨機產生5個數,這5個數每個數的範圍都在 10,35 之間,5個數的和是定值100,盡量讓5個數的概率隨機,寫出演算法?如,原來a,b,c,d,e都是20,隨機後變成a 34b 29c 11d 10e 16,但是他們之和還是100,再次隨機後a 11b 21c 13d 28e 27,他們的和還...

求教兩道演算法筆試題

最近在找工作,有把題目直接發到郵箱裡的,本人水平有限,貼出來大家幫忙看下!1 設計乙個遍歷演算法,按照方格的標號進行順序遍歷,要求一次遍歷完成所有標號方格的順序遍歷 114 2731 3539 6372 8186 9196 98100 102104 159168215 2832 3640 6473 ...

2017 08 22 今日頭條筆試題

有乙個值得分享的地方,是x排序之後對應y的問題 我用了乙個很大的陣列,以x為索引,y為陣列值,不需要用到map。其實也是因為我懶不想去學map操作了,下次試試用map。include include include using namespace std int main cin n x.clear...