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),正则表达式方式优势明显;数组较小于时,手动双重循环更快

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏对角另一面

lodash源码分析之baseFindIndex中的运算符优先级

本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

1998
来自专栏程序员互动联盟

【答疑释惑】ascii码及转义字符的含义

我们在c/c++学习开发中经常用到它,小伙伴们你们都知道那些,是不是用到的时候着急或者不知道,为什么判断字符串结尾是'\0'呢?   我们就讲讲列列ascii...

3425
来自专栏用户2442861的专栏

学习Python大数据处理模块Pandas

http://blog.csdn.net/jeapeducom/article/details/43670067

1592
来自专栏C语言及其他语言

【优秀题解】一道题目的递归与非递归两种解法

下面分享大牛一道题的两种(递归+非递归)的解法,供大家学习!也欢迎贡献你的题解! 原题链接:发工资咯 http://www.dotcpp.com/oj/pro...

2988
来自专栏禁心尽力

反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射

简单粗暴,直奔主题。 需求:通过自定义注解和反射技术,将Excel文件中的数据自动映射到pojo类中,最终返回一个List<pojo>集合?   今天我只是通...

4929
来自专栏木宛城主

SharePoint CAML In Action——Part I

在SharePoint中,我们经常要对List进行操作,比如要从List中取出相应的ListItem,利用CAML是个好办法。在没了解CAML之前,我是这样取...

2425
来自专栏闻道于事

数据库规范与数据类型选择

NUMBER :精度最高可达20个基数-100位,相当于39或40位十进制数,具体取决于小数点的位置。

1703
来自专栏王小雷

Python之数据聚合与分组运算

Python之数据聚合与分组运算 1. 关系型数据库方便对数据进行连接、过滤、转换和聚合。 2. Hadley Wickham创建了用于表示分组运算术语“spl...

2449
来自专栏恰同学骚年

剑指Offer面试题:27.最小的k个数

  这道题是典型的TopK问题,其最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这种思路的时间复杂度是O(nlogn),但...

1372
来自专栏对角另一面

lodash源码分析之baseFindIndex中的运算符优先级

我悟出权力本来就是不讲理的——蟑螂就是海米;也悟出要造反,内心必须强大到足以承受任何后果才行。 ——北岛《城门开》 本文为读 lodash 源码的第十篇,后...

27711

扫码关注云+社区

领取腾讯云代金券