天天看點

ARTS打卡第五周

Algorithm:Leetcode 6. Z 字形變換

題目描述:

将一個給定字元串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。

比如輸入字元串為

"LEETCODEISHIRING"

行數為 3 時,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N
           

之後,你的輸出需要從左往右逐行讀取,産生出一個新的字元串,比如:

"LCIRETOESIIGEDHN"

請你實作這個将字元串進行指定行數變換的函數:

string convert(string s, int numRows);
           

示例 1:

輸入: s = "LEETCODEISHIRING", numRows = 3
輸出: "LCIRETOESIIGEDHN"
           

示例 2:

輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"
           

解釋:

L     D     R
E   O E   I I
E C   I H   N
T     S     G
           

思路一:

拿到題目的首先思路就是用一個二維矩陣來存儲Z字形變換的結果。用二維矩陣需要知道三個要素:行數、列數和每個字母在矩陣中的位置。行數是輸入的,列數需要根據字元串的長度來計算,通過移動行和列的索引來确定字母在矩陣中的位置。

public String convert(String s, int numRows) {
        if(numRows == 0) {
            return null;
        }
        if(numRows == 1) {
            return s;
        }

        // 計算列數
        int tempLen = 0;
        int numCols=0;
        while(tempLen < s.length()) {
            if(numCols % (numRows-1) == 0) {
                tempLen += numRows;
            } else {
                tempLen += 1;
            }
            numCols++;
        }

        char[][] ans = new char[numRows][numCols];
        boolean down = false;
        int row=0;
        int col=0;
        // 周遊字元串
        for(int j=0; j<s.length(); j++) {
            System.out.println("row:"+ row + " col:" + col);
            ans[row][col] = s.charAt(j);
            // 改變方向
            if(row == 0 || row == numRows-1) {
                down = !down;
            }
            if(down) {
                row++;
            } else {
                row--;
                col++;
            }
        }

        StringBuilder sb = new StringBuilder();
        for(row=0; row<numRows; row++) {
            for(col=0; col<numCols; col++) {
                if(ans[row][col] != 0) {
                    sb.append(ans[row][col]);
                }
            }
        }
        return sb.toString();
    }
           

時間複雜度:周遊字元串是O(n),周遊二維數組是O(numRows*numCols) > O(n)。

思路二:

由于思路一中二維矩陣存儲中有很多單元是無用的,輸出結果前還需要将其過濾掉,增加了時間複雜度。我們可以将二維矩陣中的無效單元壓縮掉。雖然結果看上去是Z字形,但實際我們不需要按Z字形輸出,是以沒必要按Z字形存儲,可以将列存儲得更緊湊些。

public String convert(String s, int numRows) {
        if(numRows == 0) {
            return null;
        }
        if(numRows == 1) {
            return s;
        }
        numRows = Math.min(s.length(), numRows);
        StringBuilder[] ans = new StringBuilder[numRows];
        for(int i=0; i<numRows; i++) {
            ans[i] = new StringBuilder();
        }

        boolean down = false;
        int row=0;
        // 周遊字元串
        for(int j=0; j<s.length(); j++) {
            // 改變方向
            if(row == 0 || row == numRows-1) {
                down = !down;
            }
            ans[row].append(s.charAt(j));
            row += down ? 1 : -1;
        }

        StringBuilder sb = new StringBuilder();
        for(row=0; row<numRows; row++) {
            sb.append(ans[row]);
        }
        return sb.toString();
    }
           

時間複雜度:需要周遊一遍字元串,是以是O(n)

空間複雜度:需要2n個額外存儲空間,是以是O(n)

Review: The Huawei Ban — How the Trade War is Hurting Tech

美國對華為的禁令會造成什麼影響?對華為來說,硬體不是太大的問題,但是想替換掉Android系統,還是很難的。制作一個新的系統,對華為來說不是不可能,事實上,華為已經有了自己的作業系統。最大的挑戰是建立一個生态系統。

坦白地說,并沒有證據證明華為的手機相比其他Android手機有更大的安全問題。這次禁令明顯就是美中之間貿易戰的結果。

Ultimately, we’re trading innovation and technological advancement for national pride, an economic tug-of-war, and intellectual property discrepancies.

最終,我們正在用創新和技術進步來換取民族自豪感、(赢得)經濟拔河(的勝利)和(彌補)知識産權的差異

盡管華為在美國的市場佔有率不大,但仍然和美國企業形成了競争關系。從技術角度來說,這種競争促進了前沿技術的進步(面部識别、螢幕下指紋識别、彈出式相機和折疊手機等)。如果沒有這種競争關系,企業将不會再以如此快的頻率更新自己的産品,壟斷現象會加劇,科技進步将會停止。競争是工業創新的關鍵驅動力。

With better technology, humanity blossoms

有了更好的技術,人類才會繁榮

Under what conditions, then, should we be okay with sacrificing this development? How much do we value technology’s ability to improve the well-being of individuals and societies?

那麼,在什麼條件下,我麼可以犧牲這種發展呢?我們在多大程度上重視技術改善個人和社會福祉的能力呢? PS:有道翻譯的太好了!!!

If the blacklist is implemented at much larger scale, to what extent can such political actions obstruct the growth of tech and, in effect, the enhancement of quality of life?

如果黑名單被大規模實施,這種政治行為會在多大程度上阻礙科技的發展,并在實質上阻礙生活品質的提高?

Keeping this question in mind when considering global affairs is imperative, since ultimately, we are the people who are affected.

Tip: Shell腳本中如何擷取目前目錄?

#!/bin/bash
cur_dir=$(dirname $0)
cd $cur_dir
dir_path=$(pwd)
           

說明:

$0 是Shell中的特殊變量,表示目前腳本的檔案名

$(dirname $0) 擷取目前腳本所在的目錄,可能是絕對路徑,也可能是相對路徑

cd 指令進入腳本所在目錄

$(pwd) 擷取目前目錄的絕對路徑

上述腳本可以簡寫成

#!/bin/bash
dir_path=$(cd `dirname $0`; pwd)
           

附錄:Shell中的特殊變量

$$ 
Shell本身的PID(ProcessID) 
$! 
Shell最後運作的背景Process的PID 
$? 
最後運作的指令的結束代碼(傳回值) 
$- 
使用Set指令設定的Flag一覽 
$* 
所有參數清單。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。 
[email protected] 
所有參數清單。如"[email protected]"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。 
$# 
添加到Shell的參數個數 
$0 
Shell本身的檔案名 
$1~$n 
添加到Shell的各參數值。$1是第1參數、$2是第2參數…。 
           

Share: 讀碩士和博士的短短幾年真正學到的是什麼?

Intellectual Skills 智力

Communication Skills 溝通能力

Personality Characteristics 人格

Habits Of Work 工作習慣

Mechanical Skills 動手能力

繼續閱讀