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效能:
- 吞吐量
- 部署频度:单位时间生产环境的部署次数。
- 变更前置时间:从提交代码到代码成功 部署到生产环境的时间。
- 稳定性
- 服务恢复时间
- 变更失败率
- 可用性(新增)
- 技术团队和组织信守承诺并确 保 软件产品或者服务可用的能力
- 对用户则是软件产品或服务是否能被访问和使用。
它们之间相辅相成的,优秀的组织应该同时达到,而非对它们进行取舍。
参考文献
- 2018全球DevOps现状调查报告
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!