概述:
给你两个数字l、r,问在区间[l,r]内的所有数中,二进制表示下“1”的个数最多的一个数是多少,如果有多个相同的,输出所有符合条件的数中最小的一个数。
输入一个整数l,和一个整数r。(1<=l<=r<=10^9)
输出一个数字表示[l,r]内二进制下“1”的个数最多的数。如果有多个,输出符合条件的数中最小的。
示例1
输入:
5
10
输出:
7
测试用例为:
输入:
41
116969978
输出:
67108863
我的方法为暴力破解
但是需要内存很大,效率很慢,希望大神可以报名优化一下
java代码如下:
public static String tenTotwo(int N) //十进制转二进制
{
String str = "";
int x = N;
int y = 0;
while(x != 0){
y = x % 2;
x = x / 2;
str = y + str;
}
return str;
}
public static int solution(int l, int r)
{
int m=0;//计数器
int n=0;
int num=0;
for(int i=l;i<=r;i++)
{
String str=tenTotwo(i);
char[] Arr=str.toCharArray();
for(int j=0;j<Arr.length;j++)
{
if(num<=m)
{
if(Arr[j]=='1')
{
m++;//将1的个数记起来
}
}
}
if(num<m)//与上一个m对比
{
num = m;
n=i;//记下i的位置
}
m=0;
}
return n;
}
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
int l=in.nextInt();
int r=in.nextInt();
int sum=solution(l,r);
System.out.println(sum);
}
求大神优化一下思路和算法,谢谢!