当前位置: 首页 > news >正文

青海建设兵团青岛战友网站python基础教程(第3版)

青海建设兵团青岛战友网站,python基础教程(第3版),手机必备20个软件,wordpress导航兰不含101的数 题目描述 小明在学习二进制时,发现了一类不含 101的数,也就是: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个二进制不含 101 的整数? 输入描述…

不含101的数

题目描述

小明在学习二进制时,发现了一类不含 101的数,也就是:
将数字用二进制表示,不能出现 101 。
现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个二进制不含 101 的整数?

输入描述

输入的唯一一行包含两个正整数 l, r( 1 ≤ l ≤ r ≤ 10^9)。

输出描述

输出的唯一一行包含一个整数,表示在 [l,r] 区间内一共有几个不含 101 的数。

输入1 10
输出8
说明区间 [1,10] 内, 5 的二进制表示为 101 ,10的二进制表示为 1010 ,因此区间 [ 1 , 10 ] 内有 10−2=8 个不含 101的数。
输入10 20
输出7
说明区间 [10,20] 内,满足条件的数字有 [12,14,15,16,17,18,19] 因此答案为 7。

源码和解析
解析:

思路1:
for循环暴力求解。十进制转二进制再转字符串。借助字符串的indexOf来判断是否包含。
这种方式就是区间过大时花费的时间会比较久一些。

示例代码(暴力破解):

public class T28 {public static void main(String[] args) {String input="1 10";int left=Integer.parseInt(input.split(" ")[0]);int right=Integer.parseInt(input.split(" ")[1]);int count=right-left+1;// 二进制不包含101的个数for(;left<=right;left++){if(Integer.toBinaryString(left).indexOf("101")!=-1){count--;}}System.out.println(count);}
}

当输入的值为10和20时,测试输出与结果如下图:
在这里插入图片描述
解析:

思路2:使用简单数位DP算法(数不再是数,而是由多个单字符组成的字符)进行求解
若对数位DP算法不懂的,可以参考我的另一篇博客
【算法】使用数位算法生成0至某个数之间的整数(for循环之外的另一种实现方式,蛮长见识的)

public class T28 {public static int raw[] = null;public static int num[] = null;public static int count = 0;public static void main(String[] args) {String input = "20 50";int left = Integer.parseInt(input.split(" ")[0]);int right = Integer.parseInt(input.split(" ")[1]);int totalCount = right - left + 1;// 二进制不包含101的个数handle(left - 1);int leftCount = count;count = 0;handle(right);int rightCount = count;System.out.println(totalCount - (rightCount - leftCount));}public static void handle(int number) {int len = (number + "").length();raw = new int[len];num = new int[len];for (int i = 0; i < len; i++) {raw[i] = number % 10;number /= 10;}dfs(len - 1, true);}static StringBuilder sb = new StringBuilder();public static void dfs(int p, boolean limit) {if (p < 0) {for (int i = num.length - 1; i >= 0; i--) {sb.append(num[i]);}if (Integer.toBinaryString(Integer.parseInt(sb.toString())).indexOf("101") != -1) {count++;}sb.setLength(0);return;}int up = limit ? raw[p] : 9;for (int i = 0; i <= up; i++) {num[p] = i;dfs(p - 1, limit&&i==up);}}
}

算法时间比较:

输入算法输出耗时
1 10数位DP8481000纳秒
1 10暴力破解8454500纳秒
10 20数位DP7507200纳秒
10 20暴力破解7445800纳秒
2000 5000000数位DP376367622331000纳秒
2000 5000000暴力破解376367230676000纳秒

从时间的角度来说,这里并未充分发挥出数位DP算法的优势。但是数位DP算法对数字的长度限制会小很多。

http://www.yayakq.cn/news/546219/

相关文章:

  • 微信怎么做链接网站网站如何做微信支付宝
  • 如何做一张图片的网站网站seo批量查询工具
  • 四川网站建设php网站开发所需要的软件
  • 如何销售做网站网站规划有哪些内容
  • 深圳做网站哪里好手机网站开发技术pdf
  • 珠海网站建设公司有哪些建免费的网站
  • 自己有服务器如何架设网站火星时代教育培训机构学费多少
  • 沛县徐州网站开发试述网站建设的步骤
  • 知名企业网站搭建品牌中国十大咨询公司
  • 怎样在网站上做营业执照公示网站证书打印格式不正确
  • 手机网站广告阿里云网站建设好用吗
  • 用别人的照片做网站网站界面设计原则
  • php做视频网站有哪些软件丽水公司网站建设
  • 东台做网站的wordpress专栏
  • cms网站系统7天查分网站 优帮云
  • 手机CPA网站建设源码修改后端开发需要掌握什么技术
  • 如何用网站首页做404网站的标签
  • 做网站背景图片怎么放网站建设新闻+常识
  • 注册域名之后如何建设网站公司网站建设劳伦
  • 做网站需要人员wordpress4.9中文
  • 如何网站全部结构在线购物网站 项目
  • python做网站表白外贸网络推广网
  • 做网站贵不贵正规网站建设找哪家好
  • 手机网站 免费建站文学类网站怎么做
  • 网站建设维护方向Vantage wordpress主题
  • 建设安全带官方网站天元建设集团招聘官网
  • 国内优秀网站用什么软件做楼盘微网站
  • php响应式网站重庆工程项目
  • 哈尔滨建设工程信息网官方网站宿迁做网站建设的公司
  • 做网站的怎么学京东云免费建wordpress