Pipes實現LeetCode(194.轉置文件)
[LeetCode] 194.Transpose File 轉置文件
Given a text file file.txt, transpose its content.
You may assume that each row has the same number of columns and each field is separated by the ’ ‘ character.
For example, if file.txt has the following content:
name age
alice 21
ryan 30
Output the following:
name alice ryan
age 21 30
這道題讓我們轉置一個文件,其實感覺就是把文本內容當做瞭一個矩陣,每個單詞空格隔開看做是矩陣中的一個元素,然後將轉置後的內容打印出來。那麼我們先來看使用awk關鍵字的做法。其中NF表示當前記錄中的字段個數,就是有多少列,NR表示已經讀出的記錄數,就是行號,從1開始。那麼在這裡NF是2,因為文本隻有兩列,這裡面這個for循環還跟我們通常所熟悉for循環不太一樣,通常我們以為i隻能是1和2,然後循環就結束瞭,而這裡的i實際上遍歷的數字為1,2,1,2,1,2,我們可能看到實際上循環瞭3遍1和2,而行數正好是3,可能人傢就是這個機制吧。知道瞭上面這些,那麼下面的代碼就不難理解瞭,遍歷過程如下:
i = 1, s = [name]
i = 2, s = [name; age]
i = 1, s = [name alice; age]
i = 2, s = [name alice; age 21]
i = 1, s = [name alice ryan; age 21]
i = 2, s = [name alice ryan; age 21 30]
然後我們再將s中的各行打印出來即可,參見代碼如下:
解法一:
awk '{ for (i = 1; i <= NF; ++i) { if (NR == 1) s[i] = $i; else s[i] = s[i] " " $i; } } END { for (i = 1; s[i] != ""; ++i) { print s[i]; } }' file.txt
下面這種方法和上面的思路完全一樣,但是代碼風格不一樣,上面是C語言風格,而這個完全就是Bash腳本的風格瞭,我們用read關鍵字,我們可以查看read的用法read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name …]。那麼我們知道-a表示數組,將讀出的每行內容存入數組line中,那麼下一行for中的一堆特殊字符肯定讓你頭暈眼花,其實我也不能算特別理解下面的代碼,大概覺得跟上面的思路一樣,求大神來具體給講解下哈:
解法二:
while read -a line; do for ((i = 0; i < "${#line[@]}"; ++i)); do a[$i]="${a[$i]} ${line[$i]}" done done < file.txt for ((i = 0; i < ${#a[@]}; ++i)); do echo ${a[i]} done
參考資料:
https://leetcode.com/problems/transpose-file/
https://leetcode.com/problems/transpose-file/discuss/55522/AC-Solution%3A-8-lines-only-in-pure-Bash
https://leetcode.com/problems/transpose-file/discuss/55502/AC-solution-using-awk-and-statement-just-like-C.
到此這篇關於Pipes實現LeetCode(194.轉置文件)的文章就介紹到這瞭,更多相關Pipes實現轉置文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Pipes實現LeetCode(192.單詞頻率)
- Pipes實現LeetCode(195.第十行)
- C++實現LeetCode(179.最大組合數)
- C++實現LeetCode165.版本比較)
- C++實現LeetCode(119.楊輝三角之二)