Leetcode: Word Frequency (shell , awk)

單詞統計。仍然先貼代碼,再講我的思路:

# Read from the file words.txt and output the word frequency list to stdout.

#!/bin/bash

awk '
BEGIN{

while(getline < "words.txt") {
        for(i=1;i<=NF;i++) {
                freq[$i]++;
        }
}

n = asort(freq, dest);
for(word in freq) {
        reversefreq[freq[word]] = word;
}

for (j=n;j>=1;j--) {
        print reversefreq[dest[j]]" "dest[j];
}

}'

一、awk數組可以是按字符串取值,當然就想到用它,但是在其value遞增時,要不要先初始化爲0呢?另外,在判斷第一個word在不在array的index裏之前,是否需要聲明array呢?awk數組不需要聲明,且對value可以直接進行遞增操作。awk數組是我見過的最強大的數組。

二、按空格分割用到簡單的正則表達式,分隔符爲一個或多個空格,則正則表達式就是:

" +"

所有的正則表達式規則都一樣,Java的split函數,其參數也是可以用正則表達式的,例如:

String[] ssplit = s.split(" +");

也是分割一個或多個空格。不過awk使用$i取每一列的值時,已經有這樣的能力,不用再用正則表達式了。

三、asort()函數會破壞原數組的index,所以我們將排序放到dest數組上去。dest數組保存着freq數組的由小到大的value,這時候我們將freq數組的key和value互換,得到reversefreq數組。這樣,我們就能按照freq數組,取出相應的word了!這就是爲什麼題目裏有這麼一句:Don’t worry about handling ties, it is guaranteed that each word’s frequency count is unique.

總之,awk數組是我用過的最好用的數組了!


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