Swift — Udemy : HWS Swift Coding Challenges 5(字元計數)

這是一堂在Udemy上面開的課程,以下是課程網址: HWS Swift Coding Challenges。這堂課主要是讓有Swift相關經驗的朋友來學習,測試自己並提高編程技能。
我會在這篇文章中,記錄下對於Challenges(String主題)中的理解、參考資料與答案。

5.寫一個計數器,測試輸入的一字串當中某字元出現的次數並return。本題目為case-insensitive。

Swift — Udemy : HWS Swift Coding Challenges1(字元重複),這篇文章中,我的第一個解法,以dictionary為計數器就可以作為這一題的解法了。因此,我將主要記錄下導師的不同解法。


導師解法1:使用for loop

解法1:這應該是最易了解,也是最快的方法。因為在for loop運行下,只在與輸入相同的字元(count)下進行判斷,並進行計數。
唯一可以注意的是,當輸入的分別為String與Character,我們需要在for loop中為input(String)加上.characters特性。


導師解法2a : 使用reduce()

解法2a:這邊主要想了解reduce()的作用與使用方法。

reduce(_:_:)
Returns the result of combining the elements of the sequence using the given closure.

說人話:我們可以使用reduce來組合集合(如:arrayy)中的所有元素,並回傳一個值。
reduce()有兩個參數,一為初始值,另一為closure(閉包)。

如上圖所以,我們可以簡單地使用reduce()來將陣列中的元素進行組合,而不需要使用for loop 與宣告額外的變數,不管是數字還是字串。

但是reduce()更為強大的功能是可以使用閉包來自訂義reduce()可以做的事。
我們使用下圖作為例子解釋reduce()的閉包用法:

這出輸的結果為5。我們可以看到,我們先給出一個初始值 0 ,然後在閉包中加入兩個參數,分別為x與d,進行運算然後遞迴到陣列結束。
在第一次運行時,x的值就是初始值,即為0。而d的值就是陣列中第一個元素 “1”,然後進行運算。

第一次運算:0 + (1 + 1) = 2
第二次運算:2 + (1 + 2) = 5

我們可以得知在每次運算之後,都會回傳結果作為下一次x的值,即遞迴。

另外可參考:Apple官方文件 reduce(_:_:)


導師解法2b:使用map()

解法2b:在這裡,其實使用map()與上題使用reduce()的目標是相似的,都是要歷遍集合中的每個元素,且兩者牌會使用閉包來進行操作。但是map()跟reduce()的不同之處在於,map()回傳的結果只能是陣列,而reduce()可以是不同的型態,且只有reduce()可以遞迴。

map(_:)
Returns an array containing the results of mapping the given closure over the sequence’s elements.

你亦可以在dictionary和set類型使用map(),而結果都會是回傳Array。
而這使用map(),就是為了使得回傳為一個個字元的陣列,而不用透過for loop 與append(),增加程式的簡潔性。

而這個array就是為了後面的NSCountedSet而準備的。
NSCountedSet與我們常用的Set不同在於:

對於NSCountedSet而言,重複或增加的元素會增加其在集合出現的次數,而對Set而言,若元素而架在於集合中,則不會進行增加。

而在Xcode中,其中一個NSCountedSet接受的參數就是(array:[Any])。

‘NSCountedSet’ exist with these partially matching parameter lists: (capacity: Int), (array: [Any]), (set: Set<AnyHashable>), (coder: NSCoder), (object: Any), (objects: Any…), (arrayLiteral: Any…)

所以,我們把回傳的array放到NSCountedSet中進行計數。
最後使用.count(for:)這個NSCountedSet的方法來進行想要的字元的計數。

另外可參考:Apple官方文件 map(_:) count(for:)


導師解法3:聰明的方法。
解法3:原理很簡單,想法很聰明。
使用.replacingOccurrences來把要檢查的字元刪除,把把原字串與刪除後字串相減,就可以得出該字元的數量。
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.