如何获取首尾相连的循环列表中指定长度的所有子数组?
从循环列表中提取指定长度的所有子数组
核心思路
循环列表的本质是首尾相连,提取子数组时,当从某个起始位置取元素到数组末尾后,需要从数组开头继续补全剩余元素。具体逻辑如下:
- 明确原数组长度
n和目标子数组长度k,循环数组中共有n个长度为k的子数组(每个元素均可作为起始点); - 对每个起始索引
i(从0到n-1),通过取余运算(i+j) % n获取循环后的有效索引(j为子数组内的偏移量,范围是0到k-1); - 按索引依次取出元素,组成对应子数组。
示例演示
给定数组:Array = [0,1,1,0,0,1],目标子数组长度k=3:
- 起始索引0:取索引0、1、2 →
[0,1,1] - 起始索引1:取索引1、2、3 →
[1,1,0] - 起始索引2:取索引2、3、4 →
[1,0,0] - 起始索引3:取索引3、4、5 →
[0,0,1] - 起始索引4:取索引4、5、0 →
[0,1,0](到末尾后从开头补) - 起始索引5:取索引5、0、1 →
[1,0,1](到末尾后从开头补)
最终结果:[[0,1,1], [1,1,0], [1,0,0], [0,0,1], [0,1,0], [1,0,1]]
代码实现(Python)
基础写法
arr = [0, 1, 1, 0, 0, 1] k = 3 n = len(arr) subarrays = [] for start in range(n): sub = [] for offset in range(k): # 取余运算实现循环索引 idx = (start + offset) % n sub.append(arr[idx]) subarrays.append(sub) print(subarrays)
简洁写法(列表推导式)
arr = [0, 1, 1, 0, 0, 1] k = 3 n = len(arr) # 先生成所有元素的平铺列表,再按k长度拆分 flattened = [arr[(i+j) % n] for i in range(n) for j in range(k)] subarrays = [flattened[i*k : (i+1)*k] for i in range(n)] print(subarrays)
内容的提问来源于stack exchange,提问作者Shibu
相关产品推荐
相关产品推荐

