所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十四期打卡。
好像打卡已经成了一个莫名的习惯,也不知道是神马情况,不过这是好事呀,能坚持就持续坚持下去最好了呢。今天没有特别的插曲了,就是干!
二进制求和 (https://leetcode-cn.com/problems/add-binary/)
题目描述:给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
其实在这道算法题之前,还有一道是关于加一的算法,不过那个是十进制的,其实和这个还是很类似的啦。
这题,主要考察二进制相加时候的溢出问题,大家都知道,二进制是逢二进一的,所以当你在最低位需要考虑进位的问题。有两种思路,要么就是在一开始的时候,进行位数补全,使两个数字位数相同,然后进行计算;还有一个就是在使用的过程中进行动态补全,这个就看你怎么想啦。
我呢,把两个答案都贴出来,让大家参考下。反正我算法能力是不咋地,所以并不是最优解,期待你能拿出更好的解来,与我PK。
// 运行时补位
public static String addBinary(String a,String b) {
StringBuilder sb = new StringBuilder();
int lenA = a.length();
int lenB = b.length();
int ca = 0;
for (int i = lenA - 1,j = lenB - 1; i >=0 || j >= 0 ;i--,j--) {
int sum = ca;
int aResult = i >= 0 ? a.charAt(i) - '0' : 0;
sum += aResult;
int bResult = j >= 0 ? b.charAt(j) - '0' : 0;
sum += bResult;
sb.append(sum % 2);
ca = sum / 2;
}
sb.append(ca == 1 ? ca : "");
return sb.reverse().toString();
}
// 先补位,再进行计算
public static String addBinary1(String a,String b) {
StringBuilder sb = new StringBuilder();
int lenA = a.length();
int lenB = b.length();
while (lenA < lenB) {
sb.insert(0, '0');
++lenA;
}
a = sb.append(a).toString();
sb = new StringBuilder();
while (lenB < lenA) {
sb.insert(0, '0');
++lenB;
}
b = sb.append(b).toString();
System.out.println("a == " + a + " b = " + b);
sb = new StringBuilder();
int carry = 0;
for (int i = a.length() - 1; i >= 0; i--) {
char a1 = a.charAt(i);
char b1 = b.charAt(i);
int sum = Integer.valueOf(a1 + "") + Integer.valueOf(b1 + "") + carry;
if (sum >= 2) {
carry = 1;
sb.append((sum % 2));
} else {
carry = 0;
sb.append(sum);
}
}
if (carry == 1) {
sb.append("1");
}
return sb.reverse().toString();
}
Five important lessons from four years as a software developer (https://medium.com/free-code-camp/five-important-lessons-from-four-years-as-a-software-developer-9b367f256226)
现在的我真的是超级喜欢Medium推荐的内容,因为之前读了几篇关于开发经验,开发相关的文章,现在推荐给我的文章质量都是杠杠滴。有些虽然过去时间有点久,但是对于技术开发来说,还是一点都没有过时的。
不过,今天的分享,是一个工作了4年的程序员做出的工作总结,我看了他列出来的提纲,觉得还是挺有共鸣的。其实国外的程序员,和我们是一样的,包括经验总结,成长之路,以及遇到的问题是如何面对的。以前还觉得我们是两个世界的人物,但是最近看了几篇文章,就发现其实都是类似。
废话不多说,我就来分享啦。还是老规矩,把重要的,都用原文附上。作者提到了以下5点,你看看是不是也有符合你的经验总结呢?
我觉得这几点都总结的都是蛮不错的,在总结的同时,还给出了一些经验教训。我在反思,我工作年限也不短了,竟然没想到把总结做的如此深刻。比如,第三个【Think first,code later】,这就是我现在的做事风格。
拿到一个需求,一个bug,并不是马上就开始改程序或者修复bug,而是在纸上画一画,分析分析。其实,无论是写程序还是做其他的,不都是这样吗?这就是三思而后行吧。我的桌面壁纸就和这句话类似,叫做【Think Twice,Code once!】凡事都得这样,才能做出更好的产品来。
这五点都是蛮深刻,还有最后一个,任何角色都是公平的。所以遇到一个问题,或者拿到一个需求,并不是单方面地讨论就可以了,还是得相关角色人员都得在一起应对,以此得到更好的结果。
我选文的能力不是提升了,而是大数据提供的越来越给力了,有条件的,可以尝试下哦。
这次以及往后三篇,会和大家分享关于Android开发中的网络优化的内容,和大家一起学习Android的进阶。
如果说速度是关键,那对网络传输速度有决定性影响的主要有以下两个方面:
对于网络来说,我们关心的是下面这些指标:
工具 | 描述 |
---|---|
strace | 跟踪Socket相关的系统调用 |
netstat | 多种网络栈和接口统计信息 |
ifconfig | 接口配置 |
ip | 测试接口统计信息 |
ping | 测试网络连通性 |
traceroute | 测试网络路由 |
tcpdump | 网络数据包嗅探器 |
抓包工具 Wireshark/Fiddler/Charles | 图形化的网络数据检查 |
《Web性能权威指南》第一句话合格的开发者知道怎么做,而优秀的开发者知道为什么那么做
这周还是继续在设计模式的世界里前行中。
公众号地址: 设计模式之工厂模式(四)
爱生活,爱学习,爱感悟,爱挨踢