我有一個零和一個的向量v <- c(0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0)。我想要的是一個功能func做的是從左邊開始前進1直到下一個1到達,然后停止。如果之后有新的 1,則該程序應開始重復。如果1沒有找到后續的,1則將向前推進,直到向量結束。所以在這里:
v 是 c(0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0)
func(v) 應該給 c(0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0)
任何幫助表示贊賞。
uj5u.com熱心網友回復:
這聽起來像是一個游程編碼問題:
func <- function(z) {
r <- rle(z)
ind <- which(r$values == 0)
r$values[ ind[seq_along(ind) %% 2 == !(r$values[1] == 0)] ] <- 1
inverse.rle(r)
}
func(vec)
# [1] 0 1 1 1 1 1 0 0 1 1 1 0
演練:
首先,游程編碼給出每個唯一值和它的連續重復,所以
rle(v) # Run Length Encoding # lengths: int [1:9] 1 1 3 1 2 1 1 1 1 # values : num [1:9] 0 1 0 1 0 1 0 1 0解釋:第一個值是a
0,它有1個實體;第二個是a1(帶1);第三個是0有3個實體的a;。等等。從那里,知道我們可以稱之為
inverse.rle(r)再生原來v,我們需要更換的交流0與S1:知道哪些我們需要更換取決于第一個值:如果第一個是一個0,那么我們就需要更換,甚至實體0中r$values.seq_along(ind) %% 2確定特定ind(的索引0)是偶數索引還是奇數索引;!(r$values[1] == 0)為我們提供了我們想要的正確奇數/偶數分量。一旦我們知道哪個(偶數或賠率)需要從 轉移
0到1,我們只需重新分配它,然后看看r # Run Length Encoding # lengths: int [1:9] 1 1 3 1 2 1 1 1 1 # values : num [1:9] 0 1 1 1 0 1 1 1 0從這里可以清楚地看出,如果我們將它反轉回向量,我們應該得到一
0、一1、三1、一1、二等0,正是我們想要的。
uj5u.com熱心網友回復:
def fill_holes_with_ones(arr):
found, idx = False, -1
for i, el in enumerate(arr):
if found and el == 1:
for j in range(idx, i):
arr[j] = 1
found = False
elif el == 1:
idx = i
found = True
return arr
上面的代碼是用 python 撰寫的,但由于這主要是一個演算法問題,而且 python 很容易閱讀,我認為你可以相對輕松地翻譯它。
該演算法在O(n)時間復雜度(最多 2 次)和O(1)空間中運行。
這個想法是有一個標志來表明你是否已經找到了一個空缺1。還有一個索引,用于跟蹤上次找到的開口1。如果您已經找到一個開口1并看到另一個開口,請將您之前捕獲的索引1與當前索引之間的所有元素設定為 并將標志設定為 False 以使先前的開口無效。否則,如果您找到 a1它僅意味著您找到了一個 opening 1,請將標志設定為 true 并捕獲當前索引以供以后使用。
uj5u.com熱心網友回復:
基于將數字向量轉換為字串再轉換回數字向量的解決方案:
library(tidyverse)
v <- c(0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0)
z <- paste(v,collapse = "")
z %>%
str_extract_all("(10 1)") %>%
unlist() %>%
reduce(
function(x,y) str_replace(
x,
paste0("(?<!1)",y),
paste(rep("1", nchar(y)), collapse = "")),
.init = z) %>%
str_split("") %>%
unlist() %>%
as.numeric()
#> [1] 0 1 1 1 1 1 0 1 1 1 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/335899.html
