专栏首页程序员小跃Dimple在左耳听风ARTS打卡(十四)

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

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

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

Algorithm LeetCode算法

二进制求和 (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();
}

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 一篇有观点和思考的技术文章

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

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

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

本文分享自微信公众号 - 奔跑吧攻城狮(runningdimple),作者:DimpleXu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 听说你在等我的ARTS

    掐指一算,这应该是祖国妈妈生日之前最后一篇关于ARTS的打卡系列。每次周四,都感觉自己压力好大,准备资料、写算法肯定都得提前做,不然周四当天,我肯定没法完成。

    程序员小跃
  • Dimple在左耳听风ARTS打卡(二十三)

    所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algori...

    程序员小跃
  • Dimple在左耳听风ARTS打卡(第一期)

    参加了左耳听风的ARTS打卡,坚持一个月,对自己会有什么情况呢,我不知道,但我会照着这个目标坚持下去,坚持100天。一个习惯养成是21天,那如果坚持100天,效...

    程序员小跃
  • String - 316. Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters s...

    用户5705150
  • Android自定义View实现拖拽效果

    腾讯QQ有那种红点拖动效果,今天就来实现一个简单的自定义View拖动效果,再回到原处,并非完全仿QQ红点拖动。

    砸漏
  • Android EditTextView 实现带空格分隔的输入(电话号码,银行卡)

    When an object of a type is attached to an Editable, its methods will be called ...

    砸漏
  • 斐波那契数列的若干解法

    无道
  • 算法和数据结构: 十二 无向图相关算法基础

    从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记。

    yaphetsfang
  • 挑战程序竞赛系列(25):3.5最大权闭合图

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • HDU 1166 敌兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=1166

    用户2965768

扫码关注云+社区

领取腾讯云代金券