首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 查找 0/1 數組中連續 1 的段數、起止位置完整實現

     編輯:程式設計綜合問答

需求

輸入如 "0000111000111000" 的字符串,輸出:

第1段:起始索引 4,結束索引 6
第2段:起始索引 10,結束索引 12

核心邏輯:狀態機遍歷

  • 掃描字符,維護 inSegment 布爾標記。
  • 遇到 '1' 且 !inSegment → **段開始**,記錄起始索引,置 inSegment=true。
  • 遇到 '0' 且 inSegment → **段結束**,記錄結束索引 (i-1),置 inSegment=false。
  • 遍歷結束時若 inSegment 仍為真 → 最後一段延伸到末尾,記錄結束索引。

完整可運行代碼

using System;
using System.Collections.Generic;

public class SegmentFinder
{
    public static void Main()
    {
        Console.Write("請輸入 0/1 字符串:");
        string input = Console.ReadLine()?.Trim();

        if (string.IsNullOrEmpty(input))
        {
            Console.WriteLine("輸入為空。");
            return;
        }

        var segments = new List<(int Start, int End)>();
        bool inSegment = false;
        int start = -1;

        for (int i = 0; i < input.Length; i++)
        {
            char c = input[i];
            if (c == '1')
            {
                if (!inSegment)
                {
                    start = i;
                    inSegment = true;
                }
            }
            else // c == '0'
            {
                if (inSegment)
                {
                    segments.Add((start, i - 1));
                    inSegment = false;
                }
            }
        }

        // 處理以 1 結尾的情況
        if (inSegment)
        {
            segments.Add((start, input.Length - 1));
        }

        // 輸出結果
        if (segments.Count == 0)
        {
            Console.WriteLine("未發現連續 1 段。");
        }
        else
        {
            Console.WriteLine($"共發現 {segments.Count} 段連續 1:");
            for (int i = 0; i < segments.Count; i++)
            {
                var seg = segments[i];
                Console.WriteLine($"第 {i + 1} 段:起始索引 {seg.Start},結束索引 {seg.End} (長度 {seg.End - seg.Start + 1})");
            }
        }
    }
}

運行示例

輸入:0000111000111000
輸出:
共發現 2 段連續 1:
第 1 段:起始索引 4,結束索引 6 (長度 3)
第 2 段:起始索引 10,結束索引 12 (長度 3)

進階擴展:LINQ 一行流(.NET 6+)

var segments = input
    .Select((c, i) => (c, i))
    .GroupAdjacent(x => x.c == '1') // 需自定義 GroupAdjacent 或用 MoreLINQ
    .Where(g => g.Key)
    .Select(g => (Start: g.First().i, End: g.Last().i))
    .ToList();

複雜度分析

指標值
時間複雜度O(n) — 單次遍歷
空間複雜度O(k) — k 為段數,極端情況 O(n)

常見變體

  • 字節數組 byte[]:將 c == '1' 改為 b == 1。
  • 查找連續 0:邏輯對稱,或調用 FindSegments(input.Replace('1','2').Replace('0','1').Replace('2','0'))。
  • 返回索引集合:改用 List 或自定義結構體。

狀態機遍歷是處理「連續段」問題的通用模板,清晰、高效、易擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved