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

传感器ON/OFF状态向量的状态变化位置识别(含末尾ON序列忽略规则)

识别传感器ON/OFF状态向量的状态变化段起始位置

需求明确

  • 输入是必以ON开头的ON/OFF状态序列,结尾可以是ON或OFF
  • 如果序列末尾是连续的ON串,要先把这部分砍掉
  • 最终要输出所有状态连续段的起始位置(按1-based索引计数)

示例

输入序列:ON, OFF, OFF, ON, ON, OFF, OFF, ON, ON, ON, ON, OFF, OFF, OFF, OFF
预期输出:1, 2, 4, 6, 8, 12

逻辑拆解

先看示例的状态段划分(1-based位置):

  1. 位置1:单独ON
  2. 位置2-3:连续OFF
  3. 位置4-5:连续ON
  4. 位置6-7:连续OFF
  5. 位置8-11:连续ON
  6. 位置12-15:连续OFF
    输出就是每个段的起始位置。如果输入序列到位置11就结束(末尾是连续ON),那预处理时要砍掉最后这个ON段,最终输出就变成1, 2, 4, 6

实现步骤(附Python代码)

  1. 先处理末尾的连续ON:从序列最后往前找,碰到第一个非ON的位置就停,把序列截断到这个位置;如果全序列都是ON,直接返回空结果
  2. 遍历找段起始点:先把第一个位置(1)加入结果,然后从第二个元素开始,只要当前元素和前一个状态不一样,就把当前元素的1-based位置加入结果
def get_segment_starts(states):
    # 处理末尾连续ON
    if not states:
        return []
    last_valid_idx = len(states) - 1
    while last_valid_idx >= 0 and states[last_valid_idx] == 'ON':
        last_valid_idx -= 1
    if last_valid_idx < 0:
        return []
    trimmed_states = states[:last_valid_idx + 1]
    
    # 收集段起始位置
    starts = [1]
    for i in range(1, len(trimmed_states)):
        if trimmed_states[i] != trimmed_states[i-1]:
            starts.append(i + 1)  # 转成1-based索引
    return starts

# 测试示例
sample_input = ['ON', 'OFF', 'OFF', 'ON', 'ON', 'OFF', 'OFF', 'ON', 'ON', 'ON', 'ON', 'OFF', 'OFF', 'OFF', 'OFF']
print(', '.join(map(str, get_segment_starts(sample_input))))

运行这段代码就能得到示例中的预期输出。

内容的提问来源于stack exchange,提问作者ECII

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:53:12