最近我在其中一个在线比赛中遇到了一个有趣的问题;在比赛中没有问题的表述,只有单元测试来描述它。解决方案的语言是C#。该解决方案由生成的大小的字节码评分(我不知道正在使用的特定编译器,但很可能是它的MS VS 2013),以及正在运行的表现无关紧要。
问题(在我的表述中):给你一个有符号整数。以
的形式找出其最大因素2^n, n >= 1
如果没有这样的因素返回1。
我最终得到了以下解决方案:
int Puzzle(int n) {
if (n == 0) {
return n;
}
int shift = 0;
while (((1 << shift) & n) == 0) {
shift++;
}
return 1 << shift;
}
在我的解决方案中,我计算零位置的数量,直到遇到第一个。
虽然系统已接受此解决方案,但解决方案的质量评级非常低。
有没有办法用代码解决这个问题,可以用更紧凑的字节码编译?
UPD :感谢rici和一些冥想我已将我的解决方案升级为
n - n^(n&-n)
答案 0 :(得分:1)
我会尝试的是n&-n
。您可能会喜欢弄清楚它是如何工作的。