我正在question解决这个codechef!这是一个简单的问题,但我的solution超时了!看来效率不够高!请帮我优化一下。
以下是代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
System.out.println((int) (Math.pow(2, (int) ((Math.log(Integer.parseInt(br.readLine()))) / (Math.log(2))))));
}
}
}
问候
shahensha
答案 0 :(得分:3)
log(2)
缓存在变量中,而不是在每个周期计算它Math.log
(请参阅docs)计算log2
,而不是使用Integer.numberOfLeadingZeros
,因为ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)
numberOfLeadingZeros
应该非常快,因为the source code显示它只是执行一些位操作来执行其工作。
答案 1 :(得分:1)
这是否能找到下一个2的较低功率?除了调用任何日志函数(例如各种位技巧)之外,还有 way 更快的方法。通常在2的补码表示中,正x
的2的下一个较低幂与x
相同,只有x
的最高位设置,而所有其他位为零。 / p>
编辑:既然你已经确认你正在寻找下一个更低的2的功率,那么这是规范的(无分支)位黑客攻击:
/** The largest power of 2 <= x.
Only valid for positive numbers. */
static int nextLowerPowerOf2(int x) {
x >>>= 1;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x++;
return x;
}
答案 2 :(得分:0)
这是一场比赛,你会寻求帮助?如果解决方案不是来自你,你怎么能为你感到骄傲?
无论如何,这里有一些提示:
[编辑]我之前关于Math.Pow的解决方案是错误的,谢谢Andrea