- 论坛徽章:
- 0
|
本帖最后由 ywlscpl 于 2010-10-28 21:23 编辑
回复 9# sequencing
要求是:找出这种序列,长度n,(n>=1000),其中非0的个数至少为int(n-n/100+1)个,而且在这个序列中任何连续100项中0出现的次数不超过1
即满足两个条件即可:
1、序列长度>=1000
2、此序列中,任意挑连续100个数,其中出现数为0的次数最多只能为1个- awk 'BEGIN{start=1}$1=="0"{if (NR-last+1<=100) {if (NR-1-start+1>=1000) {printf "%-10s -> %10s\n",start,NR-1;start=NR}else start=last+1}last=NR}END{if (NR-start+1>=1000) printf "%-10s -> %10s\n",start,NR}' file
复制代码 设定序列起始行号为变量start,变量last用于记录当行为0时的行数
对于上面两个条件,既变成:
1、当前行-起始行+1>=1000
2、这个条件的实现其实就是:相邻两个为0的行之间的序列长度必须>100,这样就满足了“任意挑连续100个数,其中出现数为0的次数最多只能为1个”,相邻两个为0的行之间的序列长度:NR-last+1>100,不满足这个条件即 NR-last+1<=100
流程分析:当行为0时($1=="0")
1、条件2不满足了(if (NR-last+1<=100)):判断条件1是否满足(if (NR-1-start+1>=1000) ),满足条件1则打印该序列(print start,NR-1),并置变量start为当前行数NR(新序列的开始);不满足条件1,则置变量start为上一为0行的下一行(新序列开始)。
2、条件2满足:继续当前序列的延续,只需last=NR |
|