现在觉得有空时可以刷一下topcoder的DIV 2的Lvl 3的题目。感觉和刷LeetCode和WikiOi都是不一样的。
http://community.topcoder.com/stat?c=problem_statement&pm=11552&rd=14544
http://apps.topcoder.com/wiki/display/tc/SRM+519
这道题目是找规律,从6变到8的过程中有最大的15;而由35到38的过程中最大是39,主要是去掉32后,3->6的过程中有个4,所以变成32+7。所以算法就是找到最高的那个不同的位,然后把后面的都变成1就行了。
但实现的时候不熟练位操作,就参考了标程。可以看到判断某两个位是否一样可以用异或^,然后和1的shif比较。而最后把后面的位都变1则是和1的左移(就是2的幂)减一进行或做到的。
public class BinaryCards { public long largestNumber(long A, long B) { if (A == B) return A; for (int i = 60; i >= 0; i--) { if (((A^B) & (1l<<i)) != 0) return A | ((1l<<(i+1))-1); } return A; } }