免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1695 | 回复: 4
打印 上一主题 下一主题

之前的一个面试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-24 14:05 |只看该作者 |倒序浏览
0到9所有数的正则表达式:[0-9]
0的99所有数的正则表达式:[0-9] | [1-9][0-9]
0的999所有数的正则表达式:[0-9] | [1-9][0-9] | [1-9][0-9][0-9]
........
给定unsigned int n,求0到n的所有数的正则表达式。

  1. char * func(int x)
  2. {
  3.     char *re_result=(char *)malloc(MAX_LEN);
  4.     int y=x;

  5.     int round=0;
  6.     //int 对于的10进制数最多15位
  7.     char a[15];
  8.     while(y>1)
  9.     {
  10.         y=(int)(y/10);
  11.         round++;
  12.     }
  13.     itoa(x,a,10);
  14.     a[round]='\0';
  15.     //cout<<"a len : "<<strlen(a)<<"and int array: "<<a<<endl;

  16.     char b09[6]="[0-9]";
  17.     char b19[6]="[1-9]";


  18.     //这个是对比本数小一位的所有数的正则
  19.     // 65536  对应 0-9999
  20.     char re_temp_low[MAX_LEN]={0};

  21.     //这个和本数位数相同、最高位相同的所有数的正则
  22.     // 65536  对应 60000 - 65536
  23.     char re_temp_high[MAX_LEN]={0};

  24.     //这个是与本数相同位数,但是最高位小一些的数的正则,前提是本数最高位大于1
  25.     //65536  对应 10000 - 59999
  26.     char re_start[MAX_LEN]={0};

  27.     int len=round;
  28.     for(;len>=1;len--)
  29.     {
  30.         //计算re_temp_low
  31.         int len_1=len - 2;
  32.         if(len_1>=0)
  33.         {
  34.             if(len_1==0)
  35.             {
  36.                 sprintf (re_temp_low,"%s%s",re_temp_low,b09);

  37.             }
  38.             if(len_1>0)
  39.             {
  40.                 int len_2=len_1;
  41.                 sprintf(re_temp_low,"%s%s",re_temp_low,b19);
  42.                 while(len_1>0)
  43.                 {
  44.                     sprintf(re_temp_low,"%s%s",re_temp_low,b09);
  45.                     len_1--;
  46.                 }
  47.             }
  48.             sprintf(re_temp_low,"%s | ",re_temp_low);

  49.             //计算 re_temp_high

  50.             int len_high=len - 2;
  51.             //第len_num这个数要单独打印,前面的数直接输出,后面为[0-9]
  52.             int len_num=(round-1)-len_high;
  53.             //cout<<"len_num : "<<len_num<<endl;

  54.             for(int i=0;i<len_num;i++)
  55.             {
  56.                 sprintf(re_temp_high,"%s%c",re_temp_high,a[i]);

  57.             }

  58.             char temp[6]="[0-9]";
  59.             //之前a为int数组,用的下面的
  60.             //temp[3]='0'+(a[i]-0);

  61.             temp[3]=a[len_num]-1;
  62.             if(len_num != round-1)
  63.                 temp[3]=a[len_num]-1;
  64.             if(len_num == round-1)
  65.                 temp[3]=a[len_num];
  66.             sprintf(re_temp_high,"%s%s",re_temp_high,temp);

  67.             while(len_high>0)
  68.             {
  69.                 sprintf(re_temp_high,"%s%s",re_temp_high,b09);
  70.                 len_high--;

  71.             }
  72.             sprintf(re_temp_high,"%s | ",re_temp_high);

  73.         }
  74.         else break;
  75.     }

  76.     //计算re_start
  77.     if(a[0]>'1')
  78.     {

  79.         char temp[6]="[1-9]";
  80.         char temp2[6]="[0-9]";
  81.         temp[3]=a[0]-1;
  82.         if(a[0] >'2')
  83.             sprintf (re_start,"%s",temp);
  84.         else
  85.             sprintf (re_start,"%s","1");
  86.         for(int i=round;i>0;i--)
  87.             sprintf (re_start,"%s%s",re_start,temp2);
  88.         //cout<<re_start<<endl;
  89.         sprintf (re_result,"%s|%s|%s",re_start,re_temp_high,re_temp_low);
  90.         return re_result;
  91.     }

  92.     sprintf (re_result,"%s|%s",re_temp_high,re_temp_low);
  93.     return re_result;
  94. }
复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-04-24 14:14 |只看该作者
感觉应该用递归代码会比较简单

论坛徽章:
0
3 [报告]
发表于 2012-04-24 14:16 |只看该作者
0到9所有数的正则表达式:[0-9]
0的99所有数的正则表达式:[0-9] | [1-9][0-9]
0的999所有数的正则表达式:[0-9] | [1-9][0-9] | [1-9][0-9][0-9]

0到9所有数的正则表达式:[0-9]{1} = a1
0的99所有数的正则表达式:[0-9]{1} | [1-9][0-9]{1} = a2
0的999所有数的正则表达式:[0-9]{1} | [1-9][0-9]{1,2} = a3

可以递归

论坛徽章:
0
4 [报告]
发表于 2012-04-24 14:24 |只看该作者
n不一定是9999一类的啊,可能是65536之类的

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
5 [报告]
发表于 2012-04-24 14:36 |只看该作者
xuexi
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP