發表文章

目前顯示的是 9月, 2017的文章

[思路]LeetCode Problems-121. Best Time to Buy and Sell Stock

圖片
此篇文章要探討的問題Best Time to Buy and Sell Stock,意指如何在股市波段中找出最大的利潤.題目原文如下: Say you have an array for which the  i th  element is the price of a given stock on day  i . If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit. Example 1: Input: [7, 1, 5, 3, 6, 4] Output: 5 max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price) Example 2: Input: [7, 6, 4, 3, 1] Output: 0 In this case, no transaction is done, i.e. max profit = 0. 在這題中假設只能買賣一次,你必須在這一次買賣中就獲得最大的利潤.對我們來說這是很簡單從肉眼即可判斷出解答為何(意即:投資者常在看的"K線圖"),那麼對電腦來說,這應該要如何解決? 首先要思考的是:我們自己是 如何判別怎樣算賺錢呢? 對投資者來說,股票賺錢的本質就只是低買高賣,所以重要的往往不是單一的價格本身,而是兩個價格之間的差為多少? 因此,以題目的範例來說,我們感興趣的不是陣列中[7,1,5,3,6,4]的每個值,而是前後兩兩之間的 差 : [ (1-7) , (5-1) , (3-5) , (6-3) , (4-6) ] = [  -6 , 4 , -2 , 3 , -2 ] 接者就可以再進一步判斷, 要從哪一個數開始作連續相加,並要停在哪一個數值上呢? 例如假設是要從-6開始加到4,-2,3的值,還是要從4開始連續加到-2,3的值? 處理序列的連續相加問題,我們

106年推甄通訊所心得(上)

圖片
每年的九月底到十月初這段期間是大學生準備推甄研究所的繁忙時刻,去年的我在這個時間點也是忙得焦頭爛額. 這次想利用此篇文章來跟讀者分享版主我個人在準備碩班推甄的經驗,希望可以幫到同樣也是有意願來讀通訊相關科系的學弟妹們. 本篇文主要包括了在大學畢業前於系上舉辦的考研分享會的內容,並再多補充些當時時間有限,未能在分享會上提及的小技巧. 若覺得這篇文章對你們有幫助&有任何問題的話,請不吝在此篇文章下支持&留言,並分享給其他有需要的同學們. 正文開始就用這張心智圖來概括講解推甄需要準備些甚麼吧~~! 研究所推甄主要可分為三個階段: 1.初試繳交備審資料2.複試參加面試3.錄取找指導教授 我就先從第一點開始講起 1.備審資料 備審資料是個很需要花費心思的東西,這是張你是否能有機會進入研所殿堂的入門票.會有同學認為說"推甄不過就是在看成績好不好而已,不需要花時間準備"但我個人是保持著好的心態: 不管你的成績是好是壞,都應該要準備出完美的資料 .假如你的成績沒特別好,卻又不想考試只要靠推甄錄取研究所,更得在備審資料上花費心思. 在進一步解說如何做備審之前,有些資料是必須提早準備的,甚至於是應該在9月前就該做好, 我是在升大四的暑假在公司實習之餘的空暇時間完成這三大工作: *選好目標科系 ,並事先查好去年度的研究所簡章,心裡大致上曉得該準備甚麼資料 *預先準備以下資料: 大學時期拿過的獎狀 幹部/服務證明 英文證照 整理好重要的研究/計畫成果 參加活動的照片 事先查好這些資料,在做備審時會省力許多 *著手撰寫自傳草稿 自傳這種東西在備審資料中的地位其實是蠻尷尬的,審閱資料的教授不一定會對你的生平起興趣, 但同時這也是 整份資料中原創性最高,最難寫的部分 . 畢竟和讀書計畫不同,基本上你碩一碩二該做的事情其實每個人都寫得差不多,有些同學可能還會有學校學長姊經驗可以參考, 可是自傳每個人都應該是完全不同的,講白一點就是沒得抄襲. 所以我會建議這個部分,能早點想清楚如何寫是越好 假如你這三個步驟都有提早做好,那麼就可以來詳細講述備審資料的成分有哪些: *在校成績!!!!! 這可以算是蠻重要的考量之一,畢竟這個社會就如此寫實,成績越好則越有高機率能夠通過審查 以趴數

[思路]LeetCode Problems-231.326.342. Power of Two/Three/Four (冪次題型)

圖片
本篇文章要闡述的是筆者在LeetCode上碰到的一種題型:冪次(Power),大概有三個題目與其相關.題目的原文為: Given an integer, write a function to determine if it is a power of two/three/four. 給定一個整數,則你能否撰寫一個布林函數來判斷這是不是為2/3/4的冪次項呢? 根據這種類型的題目,於演算法的角度來看我們可以用多種不同的方法來解.以下在此一一分析: (一)暴力破解 對於不熟悉撰寫程式或是投機取巧的人常會用的方法,單純就是為了解題而迫不得已才使的笨方法. 暴力破解還可分成兩種: (1)把所有的2/3/4的冪次項列出來 由於變數型態Int的數值範圍在-2147483648 ~ 2147483647之間, 我們把因此在此範圍的 所~~有~~次方項 的值都列出來, 看給定的整數符不符合來判斷. 但這畢竟是個曠日廢時且效率極差的寫法 (2)只找出2/3/4的最大次方值 由於變數型態Int的數值範圍在-2147483648 ~ 2147483647之間 所以我們找出在此範圍所能容納的最大次方數為多少 (例如3的19次方為1162261467) 那麼我們只要看給定的整數能否被這數字整除即可,即寫成: bool isPowerOfThree(int n) {         return (n > 0 && 1162261467 % n = = 0);     } 這比第一種暴力解法還要省事的多,但終究是取巧的辦法 (二)迴圈解題 這算是大部分人會想嘗試下手的寫法,利用while迴圈或是函數本身遞迴解題. 通常我們在做數學題碰到這題的時候 很直覺地會用直向因數分解的辦法來找這個數是否因數皆為2/3/4, 因此在程式中最直接的方法就是不斷地對數值除以2/3/4, 看最後的餘數是否為1,若是1則傳回true,不是的話即傳回false. 並加上考慮是否為大於0的情況, 最後程式的寫法即為如下(舉3為例): if (n==0)      return false else {   while (n % 3 = = 0){     n=n/3;    }   if (n==1)