/// <summary>
/// 整数区间类
/// </summary>
private class Interval
{
private int _start = , _end = ;
public int Start
{
get { return Math.Min(this._start, this._end); }
set { this._start = value; }
}
public int End
{
get { return Math.Max(this._start, this._end); }
set { this._end = value; }
}
public bool Inside(int Value)
{
return (Start <= Value && Value <= End);
}
/// <summary>
/// 区间求并运算,此方法不修改当前实例的值。
/// 若不可合并则返回null,否则返回新的区间。
/// </summary>
/// <param name="OtherInterval">另一个区间</param>
/// <returns>新的区间实例</returns>
public Interval Merge(Interval OtherInterval)
{
if (this.Start - OtherInterval.End > || OtherInterval.Start - this.End > )
{
return null;
}
else
{
return new Interval()
{
Start = Math.Min(this.Start, OtherInterval.Start),
End = Math.Max(this.End, OtherInterval.End)
};
}
}
}
/// <summary>
/// 区间集合类
/// </summary>
private class IntervalCollection
{
public List<Interval> Intervals = new List<Interval>();
/// <summary>
/// 将一个区间并入区间集合中
/// </summary>
/// <param name="Start">开始位置</param>
/// <param name="End">结束位置</param>
public void Add(int Start, int End)
{
this.Add(new Interval() { Start = Start, End = End });
}
/// <summary>
/// 将一个区间并入区间集合中
/// </summary>
/// <param name="NewInterval">需要并入的区间结构</param>
public void Add(Interval NewInterval)
{
Interval MergeInterval = null;
for (int i = ; i < this.Intervals.Count; i++)
{
MergeInterval = this.Intervals[i].Merge(NewInterval);
if (MergeInterval != null)
{
this.Intervals[i] = MergeInterval;
break;
}
}
if (MergeInterval == null)
{
Intervals.Add(NewInterval);
}
}
/// <summary>
/// 检测区间集中是否包含有指定值
/// </summary>
/// <param name="Value">需要查询的数值</param>
/// <returns>包含返回true,否则返回false</returns>
public bool Inside(int Value)
{
foreach (Interval Inter in Intervals)
{
if (Inter.Inside(Value) == true)
{
return true;
}
}
return false;
}
/// <summary>
/// 将区间集的转换为字符串
/// </summary>
/// <typeparam name="T">转换类型</typeparam>
/// <param name="CompleteSet">全集,当序列化后若长度过长则用以求取补集</param>
/// <returns>返回转换后的字符串</returns>
public string ToString<T>(string CompleteSet = null)
{
StringBuilder Str = new StringBuilder("[");
foreach (Interval Inter in Intervals)
{
if (Inter.Start == Inter.End)
{
dynamic Vs = (object)Inter.Start;
Str.Append((T)Vs);
}
else if (Inter.End - Inter.Start == )
{
dynamic Vs = (object)Inter.Start;
dynamic Ve = (object)Inter.End;
Str.Append((T)Vs).Append((T)Ve);
}
else
{
dynamic Vs = (object)Inter.Start;
dynamic Ve = (object)Inter.End;
Str.AppendFormat("{0}-{1}", (T)Vs, (T)Ve);
}
}
Str.Append("]");
if (Str[] == '^')
{
Str = Str.Replace("^", "\\^", , );
}
// 求取补集以试图缩小代码长度
if (Str.Length >= && CompleteSet != null)
{
StringBuilder Complement = new StringBuilder("[^");
foreach (char c in CompleteSet)
{
if (this.Inside(c) == false)
{
Complement.Append(c);
}
}
Complement.Append("]");
if (Complement.Length <= Str.Length)
{
return Complement.ToString();
}
}
return Str.ToString();
}
}

整数区间及区间集合(C#实现)的更多相关文章

  1. pandas处理时间序列(2):DatetimeIndex、索引和选择、含有重复索引的时间序列、日期范围与频率和移位、时间区间和区间算术

    一.时间序列基础 1. 时间戳索引DatetimeIndex 生成20个DatetimeIndex from datetime import datetime dates = pd.date_rang ...

  2. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  3. [用CDQ分治解决区间加&区间求和]【习作】

    [前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...

  4. 线段树 区间开方区间求和 & 区间赋值、加、查询

    本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...

  5. 树状数组区间加法&区间求和操作

    树状数组区间加法&区间求和操作 一般的树状数组解决区间加&单点询问并不复杂 但是要解决区间求和... 我们假设原数组是\(\{a_i\}\),差分数组\(\{d_i=a_i-a_{i- ...

  6. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  7. hdu 1698 线段树 区间更新 区间求和

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  9. HDU 3397 Sequence operation(区间合并 + 区间更新)

    题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...

随机推荐

  1. jsp中<c:if>与<s:if>的区别

    <c:if>时jstl标签,一般与el表达式一起使用,参考http://www.360doc.com/content/11/1121/16/7874148_166229306.shtml ...

  2. UIKit Animation

    UIKit Animation 1.属性动画 - (void)changeFrameAnimation { [UIView beginAnimations:@"frameAnimation& ...

  3. 【转载】介绍“Razor”— ASP.NET的一个新视图引擎

    最近在做一个项目,用的MVC razor 视图,因为之前没用这个视图做过,于是查阅文档资料,共享一下. https://msdn.microsoft.com/zh-cn/ff849693 内容主要是讲 ...

  4. AdaBoost原理,算法实现

    前言: 当做重要决定时,大家可能综合考虑多个专家而不是一个人的意见.机器学习处理问题也是如此,这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式,前几天看了一个称作adaboost方法的介绍 ...

  5. 中文翻译:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  6. KMP算法——字符串匹配

    正直找工作面试巅峰时期,有幸在学校可以听到July的讲座,在时长将近三个小时的演讲中,发现对于找工作来说,算法数据结构可以算是程序员道路的一个考量吧,毕竟中国学计算机的人太多了,只能使用这些方法来淘汰 ...

  7. OC中常用的字符处理

    NSString *str1 = @"BeiJing"; NSString *str2 = @"beijing"; //全部转为大写 NSLog(@" ...

  8. 深入理解QStateMachine与QEventLoop事件循环的联系与区别

    最近一直在倒腾事件循环的东西,通过查看Qt源码多少还是有点心得体会,在这里记录下和大家分享.总之,对于QStateMachine状态机本身来说,需要有QEventLoop::exec()的驱动才能支持 ...

  9. Java学习----finally块

    public class Test { String x; public static void main(String[] args) { Test test = new Test(); try { ...

  10. 20 Valid Parentheses(匹配括号)

    题目意思:判断一个字符串(){}[]是否符合 思路:用栈ps:实习一个多月了,代码也刷不动了,状态真不是一般的差 class Solution { public: bool isValid(strin ...