LeetCode 1260. Shift 2D Grid in F#
URL
leetcode.com/problems/shift-2d-grid
Code
github.com/syohex/dotnet-study/blob/master/..
let toOneDimention (grid: int [,]) (cells: int) (cols: int) : int list =
let rec toOneDimention' i (grid: int [,]) cells cols acc =
if i = cells then
acc |> List.rev
else
let row = i / cols
let col = i % cols
let v = grid.[row, col]
toOneDimention' (i + 1) grid cells cols (v :: acc)
toOneDimention' 0 grid cells cols []
let shift (grid1: int list) (k: int) : int list =
let len = grid1.Length
(List.skip (len - k) grid1)
@ (List.take (len - k) grid1)
let shiftGrid (grid: int [,]) (k: int) : int [,] =
let rec shiftGrid' i cols grid1 (ret: int [,]) =
match grid1 with
| [] -> ret
| h :: t ->
let row = i / cols
let col = i % cols
ret.[row, col] <- h
shiftGrid' (i + 1) cols t ret
let rows = Array2D.length1 grid
let cols = Array2D.length2 grid
let cells = rows * cols
let grid1 = toOneDimention grid cells cols
let grid1' = shift grid1 (k % cells)
let ret = Array2D.zeroCreate<int> rows cols
shiftGrid' 0 cols grid1' ret