用正则表达式实现查出二进制数是3的倍数
来源:互联网 发布:淘宝网儿童女式凉鞋 编辑:程序博客网 时间:2024/06/04 17:47
import java.util.regex.Pattern;public class BinaryRegexp { public static Pattern multipleOf3() { // Regular expression that matches binary inputs that are multiple of 3 return Pattern.compile("^(0+|0*1((10*1)|(01*0))*10*)$");//下面是codwars上给出的最佳答案 //return Pattern.compile("0*(1(01*0)*10*)*"); }}
reg = /^(0+|0*1((10*1)|(01*0))10)$/
其中
0+表示字符串可以全为0
第一个0*表示字符串可以以0开头
核心的句式是:1((10*1)|(01*0))10)
原理如下:
一个二进制数后面加一个“0”相当于该数乘以2,一个二进制数后面加一个“1”相当于该数乘2加1。
设定三个状态,分别叫做0、1和2,它们表示当前的数除以3所得的余数。有以下的几种可能:
0@0 => 0 表示状态0后面是0时,变成状态0
0@1 => 0 表示状态0后面是1时,变成状态1
1@0 => 2 表示状态1后面是0时,变成状态2
1@1 => 0 表示状态1后面是1时,变成状态0
2@0 => 1 表示状态2后面是0时,变成状态1
2@1 => 2 表示状态2后面是1时,变成状态2
状态0既是我们的初始状态,也是我们的最终状态。我们的自动机就做好了。现在,假如二进制数10010走进来了。从状态0出发,机器首先读到一个“1”,于是当前位置挪到状态1,表明目前该数模3余1;然后,系统读了一个“0”,我们紧跟着走到状态2,表明二进制数“10”被3除余2;下一步,我们回到状态1,表明“100”除以3余1;再往后,我们得知“1001”能被3整除。最后呢,我们读到一个0,“1001”的两倍当然还是能被3整除,我们依旧停留在原位。我们得到结论:二进制数10010能被3整除。
有限状态自动机是可以转化为正则表达式的。上面的这个自动机转化起来非常容易。我们可以先试着用自然语言叙述一下。首先,每个二进制数第一位必然为“1”。到达状态1后,我们可以随意地、任意多次地在状态1周围绕圈圈,最终回到状态1。临近末尾,我们再读到一个“1”返回状态0,这之后随便读多少个“0”都可以了。现在问题分解为:我们又如何用正则表达式表述“从状态1出发随意地走最终回到状态1”呢?在本例中,这是很好描述的:它可以是字符串“1000..001”和“0111..110”的任意组合。把这些东西用正则表达式写出来,就是我们刚才那个神秘的式子:1((10*1)|(01*0))10
- 用正则表达式实现查出二进制数是3的倍数
- 正则表达式匹配出所有是4的倍数的二进制数
- 正则表达式匹配N的倍数
- 趣题:用正则表达式判断一个二进制数是否能被3整除
- 实现一个数变成基数的倍数
- 【转】写一个程序,打印数字1到100,3的倍数打印“Fizz”来替换这个数,5的倍数打印“Buzz”,对于既是3的倍数又是5的倍数的数字打印“FizzBuzz”
- python实现统计汉字/英文单词数的正则表达式
- 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
- 关于数的正则表达式
- 判断固定范围内的一组数中含有7或者是7的倍数的数
- 判断一组数中 两两一对的数 后者是否是前者的倍数
- 正则表达式--------验证二进制
- java根据正则表达式查出对应字符,并在查到的字符基础上作修改
- 即是5的倍数又是7的倍数
- C#基础-006(2)if练习 如果一个数是3的倍数 那么就输出"过" 否则输出该数
- 用正则表达式实现的常用验证
- java判断数字是否是3的倍数
- 用“埃氏筛法”求2~10000以内的素数。2~100以内的数,先去掉2的倍数,再去掉3的倍数,再去掉5的倍数,……依此类推,最后剩下的就是素数。
- 树莓派GPIO接口命名规则 A different mode has already been set解决方案
- 网卡的bond模式
- vue.js安装过程(npm安装)
- [C++]vector中的insert、resize和reserve的用法
- 注解原来是这么一回事儿
- 用正则表达式实现查出二进制数是3的倍数
- swunoj 1877 回忆的碎片
- POJ
- 商品展示
- C语言内存管理详解
- centos6.5下搭建MySql集群
- 个人记录《android map》
- HDU 1.2.4
- Android--网络图片查看器