Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件)
[LeetCode] 194.Transpose File 轉(zhuǎn)置文件
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
這道題讓我們轉(zhuǎn)置一個(gè)文件,其實(shí)感覺(jué)就是把文本內(nèi)容當(dāng)做了一個(gè)矩陣,每個(gè)單詞空格隔開(kāi)看做是矩陣中的一個(gè)元素,然后將轉(zhuǎn)置后的內(nèi)容打印出來(lái)。那么我們先來(lái)看使用awk關(guān)鍵字的做法。其中NF表示當(dāng)前記錄中的字段個(gè)數(shù),就是有多少列,NR表示已經(jīng)讀出的記錄數(shù),就是行號(hào),從1開(kāi)始。那么在這里NF是2,因?yàn)槲谋局挥袃闪?,這里面這個(gè)for循環(huán)還跟我們通常所熟悉for循環(huán)不太一樣,通常我們以為i只能是1和2,然后循環(huán)就結(jié)束了,而這里的i實(shí)際上遍歷的數(shù)字為1,2,1,2,1,2,我們可能看到實(shí)際上循環(huán)了3遍1和2,而行數(shù)正好是3,可能人家就是這個(gè)機(jī)制吧。知道了上面這些,那么下面的代碼就不難理解了,遍歷過(guò)程如下:
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]
然后我們?cè)賹中的各行打印出來(lái)即可,參見(jiàn)代碼如下:
解法一:
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
下面這種方法和上面的思路完全一樣,但是代碼風(fēng)格不一樣,上面是C語(yǔ)言風(fēng)格,而這個(gè)完全就是Bash腳本的風(fēng)格了,我們用read關(guān)鍵字,我們可以查看read的用法read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]。那么我們知道-a表示數(shù)組,將讀出的每行內(nèi)容存入數(shù)組line中,那么下一行for中的一堆特殊字符肯定讓你頭暈眼花,其實(shí)我也不能算特別理解下面的代碼,大概覺(jué)得跟上面的思路一樣,求大神來(lái)具體給講解下哈:
解法二:
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
到此這篇關(guān)于Pipes實(shí)現(xiàn)LeetCode(194.轉(zhuǎn)置文件)的文章就介紹到這了,更多相關(guān)Pipes實(shí)現(xiàn)轉(zhuǎn)置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Pipes實(shí)現(xiàn)LeetCode(193.驗(yàn)證電話號(hào)碼)
- Pipes實(shí)現(xiàn)LeetCode(195.第十行)
- Pipes實(shí)現(xiàn)LeetCode(192.單詞頻率)
- C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))
- C++實(shí)現(xiàn)LeetCode(190.顛倒二進(jìn)制位)
- C++實(shí)現(xiàn)LeetCode(309.買(mǎi)股票的最佳時(shí)間含冷凍期)
- C++實(shí)現(xiàn)LeetCode(188.買(mǎi)賣(mài)股票的最佳時(shí)間之四)
- SQL實(shí)現(xiàn)LeetCode(196.刪除重復(fù)郵箱)
相關(guān)文章
探討編寫(xiě)int strlen(char *strDest);不允許定義變量的問(wèn)題
本篇文章是對(duì)編寫(xiě)int strlen(char *strDest);不允許定義變量的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++ OpenCV繪制簡(jiǎn)易直方圖DrawHistImg
本文主要介紹了一個(gè)能繪制簡(jiǎn)易直方圖的簡(jiǎn)單函數(shù)DrawHistImg,可以幫助大家快速掌握繪制的原理,可以根據(jù)自己的創(chuàng)意對(duì)其進(jìn)行改善和補(bǔ)充。需要的朋友可以參考一下2021-12-12
C++實(shí)現(xiàn)簡(jiǎn)易圖書(shū)館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++實(shí)現(xiàn)FTP綜合應(yīng)用詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)FTP綜合應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Qt使用SqlLite實(shí)現(xiàn)權(quán)限管理的示例代碼
本文主要介紹了Qt使用SqlLite實(shí)現(xiàn)權(quán)限管理的示例代碼,管理員針對(duì)不同人員進(jìn)行權(quán)限設(shè)定,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解
這篇文章將帶大家深入了解C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法中的字符串,文中主要是介紹了字符串的定義、字符串的比較以及一些串的抽象數(shù)據(jù)類型,感興趣的可以學(xué)習(xí)一下2022-01-01

