Java 算法-二进制时间(类似于快速幂的求解)

  感觉彻底废了,好久没有做过面试题了。最近找回来了之前学习的状态,又开始在做面试题了。

题意

给了一个二进制显示时间的手表和一个非负整数 n, n 代表在给定时间表上 1 的数量, 返回所有可能的时间

注意事项

 注意事项

输出的顺序没有要求.
小时不能包含前导零, 比如 "01:00" 是不允许的, 应该为 "1:00".
分钟必须由两位数组成, 可能包含前导零, 比如 "10:2" 是无效的, 应该为 "10:02".

样例

给出 n = 1
返回 ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

1.解题思路

  说实话,楼主开始理解这个道题的题意花了很多的时间。这道题的意思就是:给出一个n值,表示1的个数,这个个数表示的是将答案转换成为二进制1的个数。例如,2:00这个转换成为二进制:10:00,所以2:00的1的个数为1。
  这个道题楼主想到的是用快速幂的方式来求解每个数中的1的个数。

    public List<String> binaryTime(int num) {

        List<String> list = new ArrayList<>();
        // 0 ~ 1259;
        for (int i = 0; i < 1259; i++) {
            int a = i % 100;
            if (a >= 60) { //如果分钟大于等于60,不合法
                continue;
            }
            int b = i / 100;
            if(b >= 12) { //如果小时大于等于 12, 不合法
                continue;
            }
            int sum = 0;
            while (a != 0) {
                if ((a & 1) == 1) {
                    sum++;
                }
                a >>= 1;
            }
            while (b != 0) {
                if ((b & 1) == 1) {
                    sum++;
                }
                b >>= 1;
            }
            if (sum == num) {
                StringBuilder stringBuilder = new StringBuilder(i + "");
                //前位补0
                if (stringBuilder.length() < 3) {
                    int length = stringBuilder.length();
                    for (int j = 0; j < 3 - length; j++) {
                        stringBuilder.insert(0, "0");
                    }
                }
                list.add(stringBuilder.insert(stringBuilder.length() - 2, ":").toString());
            }
        }
        return list;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容