首页 > 编程知识 正文

四级笔试新题型模拟题,阿里巴巴测试题完整版

时间:2023-05-04 06:51:51 阅读:10310 作者:231

概述:

给出两个数字l,r,在区间[l,r]内的所有数中,二进制表示中“1”的个数最多的数问几个,如果有多个相同的数,则输出满足所有条件的数中最小的数。

输入整数l和整数r。 (1=l=r=10^9) )

输出的数字表示[l,r]内的二进制文件中“1”的个数最多的数量。 如果有多个,则输出满足条件的数量中最小的数量。

例1

输入:

5

10

输出:

7

标题地址

68.1的个数

解决问题的方法有文档解释,文档下载地址如下

程序员面试宝典

我在这里说明解决问题的想法。 二进制数(000101…)。 在某个位置添加1对1的个数有相同的影响,但在右边添加1会减少整个二进制数。 相应地,基于该原理,在许多情况下,右位置常常满足1。 左边的位置,即高位,必须满足一定的规则。 否则,数量将超过[l,r]的范围。

因此,这里通过对r和l进行异或操作,并将从异或得到的数字传输放进getHighestPosition的函数中,可以获得r和l的二进制位置从左向右第一不同的位置。 getHighestPosition返回一个数字,指示此1从右到左排列的顺序。 将该位置作为一个标记,左为上位,右为下位。 高位必须相同。 这是因为,如果在高位追加1个的话,数量一定会超过[l,r]的范围。 那么,高位不变。 尽量让低位的位置都在一个就行了。 前提是满足[l,r]的范围。

heighNum表示高位与r、l相同,但低位都为0的数字。 (r|()- (top-1 ) ) ) ) ) )可以推测计算出的是什么。 得到高位后,heighNum将所有低位都添加1的数。 最后,该和是[l,r]中最大1且最小的数。

公共int解决方案(int r,int r ) intboundary=gethighestposition ) r^L ); int top=1 boundary; intbelow=1(边界-1); intheighnum=(r|)- (top-1 )- (top-1 ); if () heighnumtop-1 )==r ) { return r; }返回heigh num below-1; } publicintgethighestposition (intnum ) { int res=0; wile(num!=0) RES; num=(num1; }返回RES; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。