位元組跳動筆試題之01陣列聯通域個數

2021-09-24 16:46:12 字數 2563 閱讀 6661

輸入乙個只包含0和1的二維陣列,上下左右和對角相鄰的1組成乙個區塊,0不形成區塊,求陣列中的區塊個數。

輸入格式

第一行輸入兩個正整數n和m,n表示陣列行數,m表示陣列列數。

接下來n行,每行表示陣列對應的一行,每行包含m個整數,整數之間用空格隔開。

輸出格式

輸出乙個整數,表示陣列中區塊的個數。

資料範圍

0 ≤ n, m, n∗m ≤ 10^6

輸入樣例:

3 30 1 0

1 0 0

1 0 1

輸出樣例:

2樣例解釋

陣列右下角的1單獨構成乙個區塊,其他的3個1對角或上下相鄰,構成另乙個區塊。

思路一: 二維陣列進行 dfs

n,m =

list

(map

(eval

,input()

.split(

' ')))

matrix =

for _ in

range

(n):

matrix +=

input()

.split(

' ')

,

3 3

0 1 0

1 0 0

1 0 1

# 定義上下左右對角線的方位

dx =[-

1,-1

,-1,

0,0,

1,1,

1]dy =[-

1,0,

1,-1

,1,-

1,0,

1]res =

0def

dfs(i, j)

: matrix[i]

[j]=

0for k in

range

(len

(dx)):

x, y = i + dx[k]

, j + dy[k]

if x>=

0and y>=

0and x[y]==

'1':

dfs(x, y)

for i in

range

(n):

for j in

range

(m):

if matrix[i]

[j]==

'1':

res +=

1 dfs(i, j)

print

(res)

2
思路二:由於題目中的矩陣的長寬沒有給定,在 c/c++ 語言中,最好是定義指定大小的陣列,如果存在 10^6 * 10^6 的陣列,會出現爆棧情況,所以這裡有個小技巧,使用一維陣列來儲存題目的二位陣列。

那麼在二維陣列的元素下標為i,j時,對應的一維陣列元素下標應該是i*m+j

一維陣列的元素下標為k時,對應的二維陣列元素下標應該是k//m, k%m

n,m =

list

(map

(eval

,input()

.split(

' ')))

matrix =

for _ in

range

(n):

matrix +=

input()

.split(

' ')

3 3

1 1 1

0 1 0

1 0 1

matrix
['1', '1', '1', '0', '1', '0', '1', '0', '1']
res =

0def

dfs(x, y)

: matrix[x * m + y]=0

for i in

range(-

1,2)

:for j in

range(-

1,2)

: a, b = x+i, y+j

if a >=

0and a < n and b >=

0and b < m and matrix[a * m + b]

=='1'

: dfs(a, b)

for i in

range

(n):

for j in

range

(m):

if matrix[i * m + j]

=='1'

: res +=

1 dfs(i, j)

print

(res)

1

位元組跳動筆試題

要求 輸入陣列長度,然後輸入陣列中的各個元素,最後輸入整數k,要求找出陣列中三個元素小於k的三個元素,例如 輸入陣列長度 6 輸入陣列元素 2 0 1 2 3 6 輸出三元組 共4個 下面給出思路和 思路 1 獲得使用者輸入的陣列長度n,若n不為整數,則提示錯誤。2 建立陣列。3 獲得使用者輸入的陣...

位元組跳動筆試題 豆油瓶

位元組跳動 2019筆試題 豆油瓶 mart1nn的部落格 題目 抖音中每兩個使用者之間互動超過3次即互為豆油瓶,若使用者1與使用者2互動超過3次,使用者2又與使用者3互動超過三次,則使用者1與使用者3也為豆油瓶。且使用者不能與自身互動 即a i i 0,i 0,1,2,3 例1 輸入 30 2 4...

2019位元組跳動筆試題

第三題 有n個人參加程式設計比賽,比賽結束後每個人都得到乙個分數,現在所有人排成一圈 第乙個和第n個相鄰 領取獎品,要求 1.現在某個人的分數比左右的人告,那麼獎品數量也比左右的人多 2.每個人至少得到乙個獎品 問最少應該準備多少個獎品?測試用例 n組資料 每組陣列輸入n個人,n個人的分數 輸入 2...