You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将向量拆分为长度递增的非重叠子列表?

解决思路与实现代码

针对将向量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:15:38