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

  • 相关阅读:
    HTML页引用CSS
    C#反射
    Marshal.SecureStringToBSTR
    SQL语句创建表和数据库
    抽象类和抽象方法
    3 Sum Closest
    Chapter 2: Binary Search & Sorted Array
    Spiral Matrix
    Pascal's Triangle
    Plus One
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/3313973.html
Copyright © 2011-2022 走看看