190. Reverse Bits

原题链接:https://leetcode.com/problems/reverse-bits/description/
实现如下:

import java.util.HashMap;
import java.util.Map;

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.reverseBits(2));
        System.out.println(s.reverseBits(43261596));
    }

    /**
     * 这道题目虽然是easy级别的,但是我却觉得不大easy。刚开始我的思路完全受限于“或、与、非、异或”这四种位操作的组合上了,以为会有什么巧妙的
     * 组合能解决问题呢。。。没想到普通的移位操作用好了也能有神奇的效果!下面是讨论区别人的答案啦!
     *
     * 提交结果:beats 17.40%, runtime: 4ms
     *
     * @param n
     * @return
     */
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int result = 0;
        for (int i = 0; i < 32; i++) {
            result += n & 1;
            n >>>= 1; // CATCH: must do unsigned shift
            if (i < 31) { // CATCH: for last digit, don't shift!
                result <<= 1;
            }
        }
        return result;
    }

    // 然后答案的原作者又提出了一种多次调用情况下使用 HashMap 做缓存来提高效率的做法
    // 当然了,下面的评论里面还有更简洁更高效的方法,思路基本差不多,只不多优化了细节:
    public int reverseBits2(int n) {
        int result = 0;
        for(int i=0; i<32; i++){
            result <<= 1;
            result += n&1;
            n >>= 1;
        }
        return result;
    }

}
posted @ 2018-04-01 21:27  optor  阅读(97)  评论(0编辑  收藏  举报