1. 程式人生 > >leetcode-數學總結

leetcode-數學總結

leetcode-412 -Fizz Buzz-(fizz bzz)-java
解法1(成功,6ms,較慢)
不用對數進行mod,直接設定mod引數,mod3,mod5,每次+1,到3,5,為0
其餘剩餘別人的做法是直接對i%3的做法

還有i變為string型別除了string.valueof(i) 還有i+""

leetcode-204-計數質數(count primes)-java
解法1 把每個數mod質數列表,如果沒有mod為0的,則把這個數加入質數列表,如果質數>該數的開方+1,則不再檢測,少了很多時間
但這個方法不好
解法2
使用見埃拉托色尼篩法。
好方法
說的都是對迴圈條件的處理:
如果要實現篩法,需要一個O(n)的陣列來儲存每一個數是不是素數,暫定為true,篩選,把不是素數的定為false,最終數組裡為true的就是所有的素數了。如何篩選?p是素數,那麼2p, 3p……一定不是素數。事實上,如果篩的是2p, 3p……那麼考慮 2*3這個數,它被2篩了一次,又被3篩了一次,沒有必要。可以這樣篩選:對於每一個素數p,篩掉p^{2}, p^{2}+p, p^{2} + 2p……
並不需要對[2, n]的每一個數進行篩選,只需要對[2, \sqrt{n}]進行篩選,即可篩出所有不是素數的數。

leetcode-32-3的冪(power of three)-java
1 題目中的Follow up讓我們不用迴圈,那麼有一個投機取巧的方法,由於輸入是int,正數範圍是0-231,在此範圍中允許的最大的3的次方數為319=1162261467,那麼我們只要看這個數能否被n整除即可

2 利用對數的換底公式來做,高中學過的換底公式為logab = logcb / logca,那麼如果n是3的倍數,則log3n一定是整數,我們利用換底公式可以寫為log3n = log10n / log103,注意這裡一定要用10為底數,不能用自然數或者2為底數,否則當n=243時會出錯,原因請看這個帖子。現在問題就變成了判斷log10n / log103是否為整數,在c++中判斷數字a是否為整數,我們可以用 a - int(a) == 0 來判斷

leetcode-13-羅馬數字轉整數(roman to integer)-java
直接得到當前的char,將char轉為對應的數字,將now與prev對比,如果now大,說明是4或9,result=result+now-2prev;(4=1+5-21)
否則+now,然後prev=now
把switch換為map,應該可以快一點
只有在IXC的情況下才考慮prev 又可以快一點