整数区间及区间集合(C#实现)
/// <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#实现)的更多相关文章
- pandas处理时间序列(2):DatetimeIndex、索引和选择、含有重复索引的时间序列、日期范围与频率和移位、时间区间和区间算术
一.时间序列基础 1. 时间戳索引DatetimeIndex 生成20个DatetimeIndex from datetime import datetime dates = pd.date_rang ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- [用CDQ分治解决区间加&区间求和]【习作】
[前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...
- 线段树 区间开方区间求和 & 区间赋值、加、查询
本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...
- 树状数组区间加法&区间求和操作
树状数组区间加法&区间求和操作 一般的树状数组解决区间加&单点询问并不复杂 但是要解决区间求和... 我们假设原数组是\(\{a_i\}\),差分数组\(\{d_i=a_i-a_{i- ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 「模板」 线段树——区间乘 && 区间加 && 区间求和
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...
- HDU 3397 Sequence operation(区间合并 + 区间更新)
题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...
随机推荐
- FTPClient文件下载
一.FTPClient下载文件所需要的jar包: org.apache.commons.net [commons-net-3.4.jar] 二.FTPClient的连接和关闭 //FTPClient ...
- jQuery慢慢啃之事件对象(十一)
1.event.currentTarget//在事件冒泡阶段中的当前DOM元素 $("p").click(function(event) { alert( event.curren ...
- C#后台程序与HTML页面中JS方法互调
此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...
- Firebug中命令行栏(Commandlinie)的使用介绍和总结
Commandlinie是Firebug中总有用的一个特性.如果你有Microsoft Visual Studio的使用经验,你就会知道“Immediate Window” 和“Watch Windo ...
- php5.4安装ecshopphp5.4问题及解决
includes/cls_template.php line422 将 $tag_sel = array_shift(explode(" ", $tag)); 这句话拆开为两句. $tag_exp = ...
- ecshop 报错
ECShop出现Strict Standards: Only variables should be passed b (2014-06-04 17:00:37) 转载▼ 标签: ecshop 报错 ...
- __name__ == '__main__'的作用
当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...
- Linux运维需要掌握的技能 (转)
本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具.我就大概列出这几方面,这样入门就基本没问题了 ...
- 在HTML页面布局中,position的值有几种,默然的值是什么
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 从UI Automation看Windows平台自动化测试原理
前言 楼主在2013年初研究Android自动化测试的时候,就分享了几篇文章 Android ViewTree and DecorView Android自动化追本溯源系列(1): 获取页面元素 An ...