R語言程式設計 阿里推筆試題之一

2021-08-04 18:15:40 字數 4001 閱讀 5898

沐哲是乙個菜鳥倉庫的乙個揀貨員,但他有非常個怪異的習慣。每次揀貨的重量都要比之前揀的乙個輕,每次揀到貨後都可以得到1塊錢,沐哲想知道這樣最多能賺多少錢

32 34 7 33 21 2

13 12 3 11 26 36

16 30 22 1 24 14

20 23 25 5 19 29

27 15 9 17 31 4

6 18 8 10 35 28

沐哲可以從倉庫的某個貨架開始揀貨,下一步可以往上走,也可以往下走,當然,向左向右也可以,但必須使得下乙個貨物重量減小,才會去揀。在上面的倉庫中,一條可揀貨的路徑為 25-22-3。當然30-23-20-16-13-12-3可以揀的貨更多。這也是賺錢最多的一條路徑.輸入行數、列數和資料矩陣,輸出所賺的最大錢數。

例子:輸入:

6 632 34 7 33 21 2

13 12 3 11 26 36

16 30 22 1 24 14

20 23 25 5 19 29

27 15 9 17 31 4

6 18 8 10 35 28

輸出:7說明暴力求解在於求貨架上每個元素可以走的最大步數,這裡不需要儲存每一步的座標,只要判斷基於第k步的所有位址下能否存在第k+1步的位址,則意味著可以走到第k+1步,直至不滿足條件為止,此時的k即為最大步數.引數說明:

n.row: 表示原始重量矩陣的行數

n.col: 表示原始重量矩陣的列數

start.i: 表示初始貨物的橫座標

start.j: 表示初始貨物的縱座標

m:表示初始重量矩陣

num_step <- function(n.row, n.col, start.i, start.j, m)else

if(m[i,j]>m[i-1,j])else

# 判斷第k個選擇的垂直向下的貨物是否滿足

if(i==n.row)else

if(m[i,j]>m[i+1,j])else

# 判斷第k個選擇的水平向左的貨物是否滿足

if(j==1)else

if(m[i,j]>m[i,j-1])else

# 判斷第k個選擇的水平向右的貨物是否滿足

if(j==n.col)else

if(m[i,j]>m[i,j+1])else

# 將第k選擇時第s+1步滿足條件的位置儲存下來

next_id <- list(next_up, next_down, next_left, next_right,na)

next_id <- next_id[-which(is.na(next_id))] # 剔除空值

# 將所有k各選擇的s+1步滿足條件的位置儲存下來

index <- c(index, next_id)

}# 判斷s+1步是否有效,即從s到s+1步有沒有路可走

if(length(index)==0)

# 如果有路可走,則將s+1步所有的位置資訊賦給next_step

next_step <- index

s <- s+1

# 用於計數(步長)

}return(s) # 這裡步長即為貨架上以每個貨物為初始值時的最大收益

}

## 計算所有元素為起始點的最大收益

bl_step <- function(n.row, n.col, m)

} return(price)

}## 以題目中給的貨架為例:

m <-matrix(c(32, 34, 7, 33, 21, 2, 13, 12, 3, 11, 26, 36, 16, 30, 22, 1, 24, 14, 20, 23, 25, 5, 19, 29, 27, 15, 9, 17, 31, 4, 6, 18, 8, 10, 35, 28),6,byrow = t)

n.row

<- nrow(m)

print(paste("n.row",n.row, sep = "="))

n.row = 6

n.col

<- ncol(m)

print(paste("n.col",n.col, sep = "="))

n.col = 6

bl_step(n.row, n.col, m)

[,1]

[,2]

[,3]

[,4]

[,5]

[,6]

[1,] 4 5 2 3 2 1

[2,] 3 2 1 2 5 6

[3,] 4 7 2 1 4 1

[4,] 5 6 7 2 3 4

[5,] 6 3 2 3 4 1

[6,] 1 4 1 2 5 2

1.令p為乙個與初始貨架重量矩陣同維度的步數矩陣(初始元素都為0)

2.s=1,即最大步長為1開始

3.矩陣中元素滿足上下左右位置的元素都大於該元素,則該元素的最大步長為1

4.從s=2開始,取矩陣中未賦值的元素(即=0的元素),進行逐個判斷

5.判斷條件1:該元素的上下左右四個元素中至少存在最大步長為(s-1)步的元素

6.判斷條件2:若滿足判斷條件1,則上下左右除去(s-1)元素外,若其餘位置比該元素小的元素都已經賦值,也即它只能被進入而不能超其他方向走;或者其餘位置都比該元素大時,則該元素即為(s+1)步元素

7.重複3-6步,直至矩陣所以元素都已賦值時結束.引數說明:

n.row: 初始矩陣的行數

n.col: 初始矩陣的列數

m:初始貨架重量矩陣

lp_step <- function(n.row, n.col, m)else

if(i==n.row)else

if(j==1)else

if(j==n.col)else

# 將附件的元素的位置儲存下來,並取值,取步數值

round_id <- rbind(up, down, left, right,na)

round_id <- round_id[-which(is.na(round_id), arr.ind = t)[,1],]

round_value <- m[round_id]

round_p <- p[round_id]

id <- which(round_value < m[i,j])# 比該元素小的附近元素的位置

juge_last <- which(round_p==(s-1)) # 取附近最大步數為s-1的元素用於判斷

if(length(juge_last)>0)

}else

if(all(round_p[id]!=0, na.rm = t)) }}

p[temp_step] <- s # 對步數矩陣賦值

## 判斷步數矩陣是否都賦值,是則結束,否則繼續

if(length(which(p==0))==0)

s=s+1

# 計步

}return(p)

}m <-matrix(c(32, 34, 7, 33, 21, 2, 13, 12, 3, 11, 26, 36, 16, 30, 22, 1, 24, 14, 20, 23, 25, 5, 19, 29, 27, 15, 9, 17, 31, 4, 6, 18, 8, 10, 35, 28),6,byrow = t)

n.row <- nrow(m)

n.col <- ncol(m)

lp_step(n.row, n.col, m)

[,1] [,2] [,3] [,4] [,5] [,6]

[1,] 452

321[2,] 321

256[3,] 472

141[4,] 567

234[5,] 632

341[6,] 141

252

阿里演算法內推筆試題

include include include include include include include include define pi 3.1415926 define num 10000 using namespace std 請完成下面這個函式,實現題目要求的功能 當然,你也可以不按...

阿里巴巴內推題目之一

前段時間去面阿里巴巴,雖然最後以失敗告終 其實自己也不知道自己在面試的時候範了什麼錯誤 但是發現阿里巴巴面試官提出的幾個問題還是挺有 收藏價值 的所以寫了這篇部落格 題目 對於乙個從小到大的陣列,並且給定另外乙個資料data,要求從陣列中找到兩個資料,要求兩個資料之和為data,要求在o n 時間複...

面試筆試題分析之一

function sendpost callback const manager this.counter sendpost onsuccess manager.increase 輸出 undefined。原因 函式shendpost是在外面定義的window上的函式,所以內部this指向windo...