业务背景:
航空货运系统中,“货运代理商”会定期从“航空公司”领取一定数量的纸质运单(每张纸上有一个单号),这些单号都是连续的(即:每次可以理解为领取一个“号段”),而且每张单子都要向航空公司交纳一定的费用(即:单号是有价的资产)。

实际使用中,货运代理商希望下级的各营业点连续把单号用完,如果出现未连续使用的情况(即:所谓的跳号),要求快速找出来,给予提醒,提示用户优先使用跳号的运单。(否则这些运单号,一直可能不被注意到,造成浪费,而且每到期末跟航空公司对账时,也对不清楚)

思路:

A:

一个号段的号码,抽象成一个数组;每个号码的使用状态,也抽象成一个等长的数组(Y表示已使用,N表示未使用)

这样使用状态就可形成 类似 "YYYYNNYYNYNNN" 的字符串,只找正则表达式找到 "N...Y"的位置,即为跳号的位置(即:下标值),根据该位置,即可方便取出跳号的号码

B:

如果不使用正则表达式,直接双重循环,也可以查找到,若某一个元素为“N”,在它后面还有"Y",则表示该元素“被跳号”了

 <!doctype html>
<html>
<head>
<title>find SKip Number</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<script type="text/javascript">
//号段的运单列表
var arrAwbNo = ['001','002','003','004','005','006','007','008','009','010']; //该号段的单号使用状态列表(Y已使用,N未使用)
var arrStatus =['Y', 'Y', 'N', 'N', 'Y', 'N', 'Y' , 'N', 'Y', 'N']; //利用正则表达式查找
alert("正则表达式方法查找结果:" + findSkipNumberA(arrAwbNo,arrStatus) ); //利用循环直接查找
alert("双重循环查找结果:" + findSkipNumberB(arrAwbNo,arrStatus) ); function findSkipNumberA(awbNos, awbStatus){
var status = awbStatus.join('');
var groups = status.match(/(N+Y)/ig); //利用正则表达式找出 NY,NNY,...,N***Y的跳号部分 if (groups!=null){
var gapIndex = [];
//先找到跳号位置的下标索引
for(var i = 0;i<groups.length;i++){
var g = groups[i];
//alert(g); //辅助输出
var start = (gapIndex.length<=0 ? 0 : gapIndex[gapIndex.length-1]);
start = (start==0 ? 0 : start + g.length); var t = status.indexOf(g,start)
gapIndex.push(t); //NN...Y的处理
if (g.length>2){
for(var j=1;j<g.length-1;j++){
gapIndex.push(t+j);
}
}
} //根据索引,直接取出跳号号码
var gapNo = [];
for(i =0;i<gapIndex.length;i++){
gapNo.push(awbNos[gapIndex[i]]);
}
return gapNo;
} return null;
} function findSkipNumberB(awbNos, awbStatus){
var skipNumbers = [];
for(var i=0 ; i<arrStatus.length-1 ; i++){
for(var j=i+1 ; j<arrStatus.length; j++){
if (awbStatus[i]=="N" && awbStatus[j]=="Y"){
skipNumbers.push(awbNos[i]);
break;
}
}
}
return skipNumbers;
} </script>
</body>
</html>

C#的实现:

         static String[] findSkipNumberA(Regex reg, String[] awbNos, String awbStatus)
{
//Regex reg = new Regex("N+Y", RegexOptions.Compiled);
List<string> result = new List<string>(); MatchCollection matchs = reg.Matches(awbStatus); int findStartIndex = ;
foreach (Match m in matchs)
{
String matchValue = m.Groups[].Value;
findStartIndex = awbStatus.IndexOf(matchValue, (findStartIndex > ? findStartIndex + : ));
for (int i = ; i < matchValue.Length - ; i++)
{
result.Add(awbNos[findStartIndex + i]);
} findStartIndex += (matchValue.Length - );//更新下次IndexOf查找的起始位置
} return result.ToArray();
} static String[] findSkipNumberB(String[] awbNos, String[] awbStatus)
{
List<string> result = new List<string>();
for (int i = ; i < awbStatus.Length - ; i++)
{
for (int j = i + ; j < awbStatus.Length; j++)
{
if (awbStatus[i] == "N" && awbStatus[j] == "Y")
{
result.Add(awbNos[i]);
break;
}
}
}
return result.ToArray();
}

c#版实际测试下来,如果数组较大(>200),正则表达式方式优势明显;数组较小于时,手动双重循环更快

javascript:查找“跳号”号码的更多相关文章

  1. 从SEQUENCE跳号说起

    http://blog.csdn.net/agaric717/article/details/6690890 一个应用上线后发现一个使用SEQUENCE值来生成的主键经常出现断号,而且断号不是一两个, ...

  2. SAP QM 检验批跳号解决

    SAP QM 检验批跳号解决 在生产系统中,发现存在检验批规则或不规则跳号问题. 首先,查看事务代码SNRO编号范围对象QLOSE中BUFFER字段值,将其设置为NO BUFFER(无缓冲) 如果还存 ...

  3. JavaScript 通过身份证号获取出生日期、年龄、性别 、籍贯

    JavaScript 通过身份证号获取出生日期.年龄.性别 .籍贯(很全) 效果图: 示例代码: //由于没有写外部JS,所以代码比较长!!! <!DOCTYPE html PUBLIC &qu ...

  4. jsonp是什么【转载自JavaScript微信公众号】

    转自 http://mp.weixin.qq.com/s/xNnKAeLv6sO0T-IvP2AUlQ          JavaScript微信公众号 一.JSONP的诞生 首先,因为ajax无法跨 ...

  5. Javascript 查找字符串中出现最多的字符和出现的次数

    <script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...

  6. Sybase自增字段跳号的解决方法

    Sybase自增字段跳号原因及影响: 在Sybase数据库中如果数据库在开启的情况下,因为非正常的原因(死机.断电)而导致数据库服务进程强制结束. 那么自动增长的字段将会产生跳号的情况,再往数据表里面 ...

  7. 由merge into引起的序列跳号

    最近生产库反应出一个问题,某张表的主键ID并没有按照原计划的期望增加,而是间歇性跳号,每次跳2万多,经过研究发现是某个同步过程的merge into引起的,具体语句如下 merge into t_if ...

  8. html php javascript 页面跳转

    <!-- html标签跳转 --><meta http-equiv="refresh" content="3;url=http://localhost/ ...

  9. ORACLE SEQUENCE跳号总结

      在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会 ...

随机推荐

  1. equals()和hashCode()之间的关系

    在Java的基类java.lang.Object中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() 对这两个方法的 ...

  2. mysql动态行转列

    测试数据 DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `id` ) NOT NULL AUTO_INCREMENT, `class` ) ...

  3. Activiti之 Exclusive Gateway

    一.Exclusive Gateway Exclusive Gateway(也称为XOR网关或更多技术基于数据的排他网关)经常用做决定流程的流转方向.当流程到达该网关的时候,所有的流出序列流到按照已定 ...

  4. iOS 读取相册二维码,兼容ios7(使用CIDetector 和 ZXingObjC)

    ios从相册读取二维码,在ios8以上,苹果提供了自带的识别图片二维码的功能,这种方式效率最好,也是最推荐的,但是如果你的系统需要向下兼容ios7,就必须用其他方式. 这里我选择的是 ZXingObj ...

  5. 关于CocoaPods update/CocoaPods install 慢、没反应、卡住的解决方案(Pods升级步骤)

    pod管理第三方库带来的便利大家有目共睹,但是--,估计有很多人会遇到这样一种尴尬情况: Pod install 或 Pod update  执行之后,就不动了,一直一个界面简直要崩溃... 网上有很 ...

  6. Centos 7 ASP.NET Core 1.0 Docker部署

    先决条件 64位,内核3.10以上,查看当前的内核版本,打开一个终端使用uname -r显示您的内核版本             安装 sudo yum update     sudo tee /et ...

  7. PHP5.2至5.6的新增功能详解

    截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注]. 因为 PHP ...

  8. 彻底理解JavaScript原型

    原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"[[prototype]]"属性,函数对象有"prototype"属性,原型对 ...

  9. python curses使用

    python 中curses封装了c语言的curses,把c中复杂部分简单化,比如addstr(),mvaddstr(),mvwaddstr()合并成了一个addstr()方法. 一.语法入门 1.打 ...

  10. plain framework 1 pak插件说明(资源压缩加密)

    在互联网的发展中,资源的整理一般成了发布软件应用的迫在眉睫的一件事情,不经打包的资源往往容易暴露而且众多的文件使得拷贝等待时间变长.在这种情况下,一种应用便诞生了,其起源是源自压缩软件,这便是我们今天 ...