javascript:查找“跳号”号码

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

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

思路: 

A:

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

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

B:

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

 1 <!doctype html>
 2 <html>
 3     <head>
 4         <title>find SKip Number</title>
 5         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9         //号段的运单列表
10         var arrAwbNo = ['001','002','003','004','005','006','007','008','009','010'];
11
12         //该号段的单号使用状态列表(Y已使用,N未使用)
13         var arrStatus =['Y',   'Y',  'N',  'N',  'Y',  'N',  'Y' , 'N',  'Y',  'N'];
14
15         //利用正则表达式查找
16         alert("正则表达式方法查找结果:" +  findSkipNumberA(arrAwbNo,arrStatus) );
17
18         //利用循环直接查找
19         alert("双重循环查找结果:" + findSkipNumberB(arrAwbNo,arrStatus) );
20
21         function findSkipNumberA(awbNos, awbStatus){
22             var status = awbStatus.join('');
23             var groups = status.match(/(N+Y)/ig);    //利用正则表达式找出 NY,NNY,...,N***Y的跳号部分
24
25             if (groups!=null){
26                 var gapIndex = [];
27                 //先找到跳号位置的下标索引
28                 for(var i = 0;i<groups.length;i++){
29                     var g = groups[i];
30                     //alert(g); //辅助输出
31                     var start = (gapIndex.length<=0  ? 0 : gapIndex[gapIndex.length-1]);
32                     start = (start==0 ? 0 : start + g.length);
33
34                     var t = status.indexOf(g,start)
35                     gapIndex.push(t);
36
37                     //NN...Y的处理
38                     if (g.length>2){
39                         for(var j=1;j<g.length-1;j++){
40                             gapIndex.push(t+j);
41                         }
42                     }
43                 }
44
45                 //根据索引,直接取出跳号号码
46                 var gapNo = [];
47                 for(i =0;i<gapIndex.length;i++){
48                     gapNo.push(awbNos[gapIndex[i]]);
49                 }
50                 return gapNo;
51             }
52
53             return null;
54         }
55
56         function findSkipNumberB(awbNos, awbStatus){
57             var skipNumbers = [];
58             for(var i=0 ; i<arrStatus.length-1 ; i++){
59                 for(var j=i+1 ; j<arrStatus.length; j++){
60                     if (awbStatus[i]=="N" && awbStatus[j]=="Y"){
61                         skipNumbers.push(awbNos[i]);
62                         break;
63                     }
64                 }
65             }
66             return skipNumbers;
67         }
68
69         </script>
70     </body>
71 </html>

 C#的实现:

 1         static String[] findSkipNumberA(Regex reg, String[] awbNos, String awbStatus)
 2         {
 3             //Regex reg = new Regex("N+Y", RegexOptions.Compiled);
 4             List<string> result = new List<string>();
 5
 6             MatchCollection matchs = reg.Matches(awbStatus);
 7
 8             int findStartIndex = 0;
 9             foreach (Match m in matchs)
10             {
11                 String matchValue = m.Groups[0].Value;
12                 findStartIndex = awbStatus.IndexOf(matchValue, (findStartIndex > 0 ? findStartIndex + 1 : 0));
13                 for (int i = 0; i < matchValue.Length - 1; i++)
14                 {
15                     result.Add(awbNos[findStartIndex + i]);
16                 }
17
18                 findStartIndex += (matchValue.Length - 1);//更新下次IndexOf查找的起始位置
19             }
20
21             return result.ToArray();
22         }
23
24         static String[] findSkipNumberB(String[] awbNos, String[] awbStatus)
25         {
26             List<string> result = new List<string>();
27             for (int i = 0; i < awbStatus.Length - 1; i++)
28             {
29                 for (int j = i + 1; j < awbStatus.Length; j++)
30                 {
31                     if (awbStatus[i] == "N" && awbStatus[j] == "Y")
32                     {
33                         result.Add(awbNos[i]);
34                         break;
35                     }
36                 }
37             }
38             return result.ToArray();
39         }

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

时间: 2024-07-31 16:53:57

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

算法-给你一个含有1亿个QQ号码的文件,如何快速的查找某个QQ号码?

问题描述 给你一个含有1亿个QQ号码的文件,如何快速的查找某个QQ号码? 50C 如题,我要找一个效率比较高的方法,欢迎大家来讨论.如果答案是暴力扫最快的话,我自扇耳光三百下! 解决方案 最简单的办法就是字典树.查找效率为Log(N) 解决方案二: 一个含有1亿个QQ号码的文件,面对这种大数据处理,还要满足最快查找到QQ的需求,如果是我,我会先从这几方面考虑. 一.硬件配置 二.编程语言 三.算法 四.查前判断 五.存储区域 -------------------------------且听我慢

超精准的javascript验证身份证号的具体实现方法_javascript技巧

编写程序前先来了解下身份证号的构成: 身份证号分为两种,旧的为15位,新的为18位. 身份证15位编码规则:dddddd yymmdd xx p    其中 dddddd:地区码    yymmdd: 出生年月日    xx: 顺序类编码,无法确定    p: 性别,奇数为男,偶数为女: 身份证18位编码规则:dddddd yyyymmdd xxx y    其中 dddddd:地区码    yyyymmdd: 出生年月日     xxx:顺序类编码,无法确定,奇数为男,偶数为女    y: 校

Javascript页面跳转常见实现方式汇总_javascript技巧

本文实例总结了Javascript页面跳转常见实现方式.分享给大家供大家参考,具体如下: 概述 相信很多Web开发者都知道,在开发Web程序的时候,对于页面之间的跳转,有很多种,但是有效的跳转则事半功倍,下面就是我在平时的开发过程中所用到的一些JavaScript跳转方式,拿出和大家共享一下. 第一种:直接跳转加参数 <script language="javascript" type="text/javascript"> window.location

基于javascript实现根据身份证号码识别性别和年龄_javascript技巧

本文实例介绍了javascript实现根据身份证号码识别性别和年龄的详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: <html> <head> <meta charset="gb2312"> <title>jb51</title> <script type="text/javascript"> function discriCard(UUserCard) { UUserCar

基于JavaScript实现跳转提示页面_javascript技巧

先给大家展示下效果图,如果大家感觉还不错,请参考实现代码: 网页布局 <p>操作成功</p> <strong>5</strong><span>秒后回到主页</span><a href="javascript:history.back();">返回</a> 任务: 1.打开网页后,如果不做任何操作则返回到一个新的页面 var num=document.getElementsByTagName(

oracle中通过update _NEXT_OBJECT 实现obj$.obj#和obj$.dataobj#跳号

在一些特殊的情况下(比如ORA-00600 [15267],ORA-00600 [KKDLCOB-OBJN-EXISTS],Ora-600 [15260]),考虑需要把dba_objects中的object_id往前推进,这里通过试验的方法实现该功能 数据库版本信息 SQL> select * from v$version;   BANNER ---------------------------------------------------------------- Oracle Datab

ORACLE SEQUENCE跳号总结

      在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢?     事务回滚引起的跳号     不管序列有没有CACHE.事务回滚这种情况下,都会引起序列的跳号.如下实验所示:   SQL> create sequence my_sequence   2  start with 1   3  increment by 1   4  ma

javascript验证身份证号

 我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码 表示编码对象出生的年.月.日,按

javascript验证身份证号_javascript技巧

我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码 表示编码对象出生的年.月.日,按G