public static IntegerSegment IntersectionOfSegments(IntegerSegment segment1, IntegerSegment segment2) { if ((segment1.Start > segment2.End) || (segment1.End < segment2.Start)) { return(IntegerSegment.Zero); } else { var start = Math.Max(segment1.Start, segment2.Start); var end = Math.Min(segment1.End, segment2.End); return(new IntegerSegment(start, end)); } }
/// <summary> /// Search for all-zero segments of array with given minimal length /// </summary> /// <param name="array">Input array</param> /// <param name="minimalSegmentLength">Minimal length of segment</param> /// <returns>List of segments, which contains only zeros</returns> public static IList <IntegerSegment> FindZeroSegments(UInt32[] array, int minimalSegmentLength) { var result = new List <IntegerSegment>(); if (array.Length < minimalSegmentLength) { return(result); } int lastZero = -1; for (var i = 0; i < array.Length; i++) { if (array[i] == 0) { if (lastZero == -1) { lastZero = i; } if (i == (array.Length - 1)) { var segment = new IntegerSegment(lastZero, i); if (CheckSegmentLength(segment, minimalSegmentLength)) { result.Add(segment); } } } else { if (lastZero != -1) { var segment = new IntegerSegment(lastZero, i - 1); lastZero = -1; if (CheckSegmentLength(segment, minimalSegmentLength)) { result.Add(segment); } } } } return(result); }
private static bool CheckSegmentLength(IntegerSegment segment, int minimalSegmentLength) { return((segment.End - segment.Start + 1) >= minimalSegmentLength); }