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""1"

輸出: "100"

示例 2

輸入: a = "1010", b = "1011"輸出: "10101""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();}
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點,你看看是不是也有符合你的經驗總結呢?

  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.

我覺得這幾點都總結的都是蠻不錯的,在總結的同時,還給出了一些經驗教訓。我在反思,我工作年限也不短了,竟然沒想到把總結做的如此深刻。比如,第三個【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 一篇有觀點和思考的技術文章

這周還是繼續在設計模式的世界裏前行中。

公衆號地址:
設計模式之工廠模式(四)

愛生活,愛學習,愛感悟,愛挨踢
640?wx_fmt=jpeg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章