Fork me on GitHub

ARTS08

Algorithms-Review-Tip-Share

Posted by Kaelzhang on December 16, 2018

Algorithm

401. 二进制手表

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

例如,上面的二进制手表读取 “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)

Share

DevOps调查报告提到的软件交付与运维的效能,简称SDO效能:

  1. 吞吐量
    1. 部署频度:单位时间生产环境的部署次数。
    2. 变更前置时间:从提交代码到代码成功 部署到生产环境的时间。
  2. 稳定性
    1. 服务恢复时间
    2. 变更失败率
  3. 可用性(新增)
    1. 技术团队和组织信守承诺并确 保 软件产品或者服务可用的能力
    2. 对用户则是软件产品或服务是否能被访问和使用。

它们之间相辅相成的,优秀的组织应该同时达到,而非对它们进行取舍。

参考文献

  1. 2018全球DevOps现状调查报告

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!