ARTS08

栏目: 编程工具 · 发布时间: 5年前

内容简介:二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。 每个 LED 代表一个 0 或 1,最低位在右侧。例如,上面的二进制手表读取 “3:25”。 给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。

Algorithm

401. 二进制手表

二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。 每个 LED 代表一个 0 或 1,最低位在右侧。

ARTS08

例如,上面的二进制手表读取 “3:25”。 给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。

案例:

输入: n = 1 返回: [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]

注意事项:

输出的顺序没有要求。 小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。 分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。

解决方案:

我的解法:

class Solution {
    public List<String> readBinaryWatch(int num) {
        int[] hours = {8, 4, 2, 1};
        int[] minutes = {32, 16, 8, 4, 2, 1};
        List<String> result = new ArrayList<>();

        for (int i = 0; i <= num; i++) {
            List<Integer> listHours = generateDigit(hours, i);
            List<Integer> listMinutes = generateDigit(minutes, num - i);
            for ( int hour : listHours) {
                if (hour >= 12) continue;
                for (int minute: listMinutes) {
                    if (minute >= 60) continue;
                    result.add(hour +  ":" + (minute < 10 ? "0" + minute : minute));
                }
            }
        }

        return result;
    }

    private List<Integer> generateDigit(int[] nums, int count) {
        List<Integer> result = new ArrayList<>();
        generateDigitHelper(nums, count, 0, 0, result);
        return result;
    }

    private void generateDigitHelper(int[] nums, int count, int pos, int sum, List<Integer> result) {
        if(count == 0) {
            result.add(sum);
            return;
        }

        for(int i = pos; i < nums.length; i++){
            generateDigitHelper(nums, count - 1, i + 1, sum + nums[i], result);
        }
    }
}

更好的解法:

class Solution {
    
    int[] weight = {8, 4, 2, 1, 32, 16, 8, 4, 2, 1};
    
    public List<String> readBinaryWatch(int num) {
        List<String> res = new ArrayList<>();
        helper(0, 0, 0, num, res);
        return res;
    }
    
    private void helper(int hour, int min, int index, int num, List<String> res) {
        if (hour > 12 || min >= 60 || hour == 12 && min == 0) {
            return;
        }
        if (num == 0) {
            String strMin = String.valueOf(min);
            if (strMin.length() == 1) {
                strMin = "0" + strMin;
            }
            res.add(String.valueOf(hour) + ":" + strMin);
        } else if (index < 10 && num <= 10 - index && num > 0) {
            helper(hour, min, index + 1, num, res);
            if (index < 4) {
                helper(hour + weight[index], min, index + 1, num - 1, res);
            } else {
                helper(hour, min + weight[index], index + 1, num - 1, res);
            }
        }
    }
}

python解法:

class Solution:
    def readBinaryWatch(self, num):
        """
        :type num: int
        :rtype: List[str]
        """
        return ['%d:%02d' % (h, m)
                for h in range(12) for m in range(60)
                if (bin(h) + bin(m)).count('1') == num]

Review

对待代码评审的心态

本文认为在代码评审这项实践中心态是最为重要的。

消极心态示例

作者:我写了很多编码,我为此感到自豪。 我真的想合并,但我需要请某人检查我的工作。

评论者:我忙于自己的代码,但现在我还有另一个任务要做。

作者:这可能需要很长时间……

评论者:有人在动我的代码,我最好确保他们不会搞砸。

作者:嗯……我认为评论者甚至不理解我正在做的事情。

积极心态示例

作者:我写了一些很棒的代码,但我知道它并不完美,我想改进,所以我想得到我信任的人的反馈。 他们很忙,所以我应该让评论尽可能简单。

评论者:有人很信任我,让我看看她花了几个小时的工作。 我应该尽我所能尽快给予建设性的反馈。

作者:评论者可能很困惑。 我需要让我的代码更清晰。

评论者:某些部分修改得很棒,特别是考虑到她刚加入团队。 我应该让她知道。

作者:我感谢他们的努力和时间。 反馈很有帮助。

作者

当作者以积极的方式思考时,他们自然会:

  • 尽职尽责,尽力编写好的代码;
  • 小心、仔细地检查他们的工作;
  • 写清晰的提交消息来说明变更;
  • 将大修改成小段提交,使评审者的工作变得更轻松;
  • 当评审者指出错误或改进时,不会感到难受;
  • 从反馈中学习而不是保护自己。

##评论者 当评论者以积极的方式思考时,他们自然会:

  • 及时回复评审请求;
  • 尽力全面地审查代码;
  • 积极提供建设性的反馈,并指出潜在的错误和改进;
  • 要善良,耐心,并使用大量的☺;
  • 同理作者的情况 - 也许他们是新人,他们还不熟悉代码库; 也许他们功能发布的压力; 或者现有代码可能是令人困惑的;
  • 从变化中学习,而不是批评它们。

Build the culture first, the rest will follow, as always.

Tip

hub是一个针对github操作的命令行包装库。

macOS: 安装方式

$ brew install hub

别名

$ alias git=hub

$ git version git version 2.17.0 hub version 2.3.0 # ← it works!

克隆项目

$ git clone dotfiles → git clone git://github.com/YOUR_USER/dotfiles.git

克隆其他项目

$ git clone github/hub → git clone git://github.com/github/hub.git

打开当前项目issues页面

$ git browse – issues → open https://github.com/github/hub/issues

打开其他项目wiki

$ git browse mojombo/jekyll wiki → open https://github.com/mojombo/jekyll/wiki

创建主题分支

$ git checkout -b feature ( making changes … ) $ git commit -m “done with feature”

\fork repo

$ git fork → (forking repo on GitHub…) → git remote add YOUR_USER git://github.com/YOUR_USER/hub.git

push变更到远端

$ git push YOUR_USER feature

开启一个主题分支的pull request

$ git pull-request → (opens a text editor for your pull request message)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

小圈子·大社交

小圈子·大社交

Paul Adams / 王志慧 / 人民邮电出版社 / 2013-1 / 29.00元

网络正在脱离以内容为核心构建的方式,转向以人为核心重新构建。这样深远的变革将影响我们制定商业策略、设计以及营销和广告的方式。 本书作者先后在谷歌和Facebook供职,对于社交网络有深入的研究和丰富的实战经验。他以学术界和工业界最新的调查研究为基础,阐述了人们如何通过社交圈子相互联系的规律,探讨了理念和品牌信息如何通过社交网络传播开来的过程。书中介绍了许多实际的例子,通过这些鲜活的实例,你将......一起来看看 《小圈子·大社交》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具