前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dimple在左耳听风ARTS打卡(十四)

Dimple在左耳听风ARTS打卡(十四)

作者头像
程序员小跃
发布2019-12-27 15:00:12
2630
发布2019-12-27 15:00:12
举报
文章被收录于专栏:程序员小跃程序员小跃

所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十四期打卡。

好像打卡已经成了一个莫名的习惯,也不知道是神马情况,不过这是好事呀,能坚持就持续坚持下去最好了呢。今天没有特别的插曲了,就是干!

Algorithm LeetCode算法

二进制求和 (https://leetcode-cn.com/problems/add-binary/)

题目描述:给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1

代码语言:javascript
复制
输入: a = "11", b = "1"

输出: "100"

示例 2

代码语言:javascript
复制
输入: a = "1010", b = "1011"

输出: "10101"

其实在这道算法题之前,还有一道是关于加一的算法,不过那个是十进制的,其实和这个还是很类似的啦。

这题,主要考察二进制相加时候的溢出问题,大家都知道,二进制是逢二进一的,所以当你在最低位需要考虑进位的问题。有两种思路,要么就是在一开始的时候,进行位数补全,使两个数字位数相同,然后进行计算;还有一个就是在使用的过程中进行动态补全,这个就看你怎么想啦。

我呢,把两个答案都贴出来,让大家参考下。反正我算法能力是不咋地,所以并不是最优解,期待你能拿出更好的解来,与我PK。

代码语言:javascript
复制
// 运行时补位
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();
}

Review 阅读并点评至少一篇英文文章

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点,你看看是不是也有符合你的经验总结呢?

  • Never Assume
  1. Never assume that someone will do something just because you’ve asked them to.
  2. Never assume someone understands what you’ve told them, even if they say they do.
  3. Never assume the other party is wrong.
  • The non-technical problems are the most difficult
  • Think first, code later
  • What you create is more important than the tools used to create it
  • Every role is equally important

我觉得这几点都总结的都是蛮不错的,在总结的同时,还给出了一些经验教训。我在反思,我工作年限也不短了,竟然没想到把总结做的如此深刻。比如,第三个【Think first,code later】,这就是我现在的做事风格。

拿到一个需求,一个bug,并不是马上就开始改程序或者修复bug,而是在纸上画一画,分析分析。其实,无论是写程序还是做其他的,不都是这样吗?这就是三思而后行吧。我的桌面壁纸就和这句话类似,叫做【Think Twice,Code once!】凡事都得这样,才能做出更好的产品来。

这五点都是蛮深刻,还有最后一个,任何角色都是公平的。所以遇到一个问题,或者拿到一个需求,并不是单方面地讨论就可以了,还是得相关角色人员都得在一起应对,以此得到更好的结果。

我选文的能力不是提升了,而是大数据提供的越来越给力了,有条件的,可以尝试下哦。

Tip 一个技术技巧

这次以及往后三篇,会和大家分享关于Android开发中的网络优化的内容,和大家一起学习Android的进阶。

网络优化(上):移动开发工程师必备的网络优化知识
网络基础知识
  1. 无线网络
  2. Link Turbo
网络I/O
  1. I/O 模型
  2. 数据处理
网络性能评估
  1. 延迟与带宽

如果说速度是关键,那对网络传输速度有决定性影响的主要有以下两个方面:

  • 延迟:数据从信息源发送到目的地所需的时间
  • 带宽:逻辑或物理通信路径最大的吞吐量
  1. 性能测量

对于网络来说,我们关心的是下面这些指标:

  • 吞吐量:网络接口接收和传输的每秒字节数
  • 延迟:系统调用发送/接收延时、连接延迟、首包延迟、网络往返等
  • 连接数:每秒的连接数
  • 错误:丢包计数、超时等

工具

描述

strace

跟踪Socket相关的系统调用

netstat

多种网络栈和接口统计信息

ifconfig

接口配置

ip

测试接口统计信息

ping

测试网络连通性

traceroute

测试网络路由

tcpdump

网络数据包嗅探器

抓包工具 Wireshark/Fiddler/Charles

图形化的网络数据检查

《Web性能权威指南》第一句话合格的开发者知道怎么做,而优秀的开发者知道为什么那么做

Share 一篇有观点和思考的技术文章

这周还是继续在设计模式的世界里前行中。

公众号地址: 设计模式之工厂模式(四)

爱生活,爱学习,爱感悟,爱挨踢

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奔跑吧攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Algorithm LeetCode算法
  • Review 阅读并点评至少一篇英文文章
  • Tip 一个技术技巧
    • 网络优化(上):移动开发工程师必备的网络优化知识
      • 网络基础知识
        • 网络I/O
          • 网络性能评估
          • Share 一篇有观点和思考的技术文章
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档