如何将向量拆分为长度递增的非重叠子列表?
解决思路与实现代码
针对将向量letters[1:7]拆分为长度依次递增1的非重叠子列表并保留剩余元素的需求,以下是几种可行的实现思路和代码:
思路一:循环生成分组长度后拆分
先计算每个子列表的目标长度,再生成分组标识进行拆分:
vec <- letters[1:7] group_lengths <- c() current_sum <- 0 i <- 1 n <- length(vec) # 生成递增的分组长度,直到累计长度接近向量总长度 while(current_sum + i <= n){ group_lengths <- c(group_lengths, i) current_sum <- current_sum + i i <- i + 1 } # 加入剩余元素的长度 if(current_sum < n){ group_lengths <- c(group_lengths, n - current_sum) } # 生成每个元素对应的分组编号 groups <- rep(seq_along(group_lengths), times = group_lengths) # 拆分向量 result <- split(vec, groups)
思路二:利用累计和快速确定分组
通过计算1、1+2、1+2+3...的累计和,快速定位最大的递增分组长度:
vec <- letters[1:7] n <- length(vec) # 找到最大的k,使得1+2+...+k ≤ n max_k <- which.max(cumsum(1:n) > n) - 1 # 构建分组长度向量 group_lengths <- c(1:max_k, n - sum(1:max_k)) # 生成分组编号并拆分 groups <- rep(1:(max_k + 1), times = group_lengths) result <- split(vec, groups)
思路三:直接循环截取子向量
最直观的方式,逐个计算每个子列表的起止位置并截取:
vec <- letters[1:7] result <- list() start <- 1 i <- 1 n <- length(vec) while(start <= n){ # 当前分组的结束位置,避免超出向量范围 end <- min(start + i - 1, n) result[[i]] <- vec[start:end] # 更新下一个分组的起始位置和长度 start <- end + 1 i <- i + 1 }
三种方法最终都能得到预期的拆分结果:
[[1]] [1] "a" [[2]] [1] "b" "c" [[3]] [1] "d" "e" "f" [[4]] [1] "g"
内容的提问来源于stack exchange,提问作者benson23
相关产品推荐
相关产品推荐

