204. Count Primes
時間 O(NloglogN) 空間 O(N)
如果一個數(shù)是另一個數(shù)的倍數(shù),那這個數(shù)肯定不是素數(shù)。利用這個性質(zhì),我們可以建立一個素數(shù)數(shù)組,從2開始將素數(shù)的倍數(shù)都標(biāo)注為不是素數(shù)。第一輪將4、6、8等表為非素數(shù),然后遍歷到3,發(fā)現(xiàn)3沒有被標(biāo)記為非素數(shù),則將6、9、12等標(biāo)記為非素數(shù),一直到N為止,再數(shù)一遍素數(shù)數(shù)組中有多少素數(shù)。
由于1和0都不是質(zhì)數(shù),所以初始化完數(shù)組后,要res[0] = False, res[1] = False
需要注意數(shù)組的越界問題。雙層循環(huán),外層循環(huán)從2到int((n-1)**0.5)+1, 內(nèi)層循環(huán)也是從2開始,到(n-1)/j + 1,n都要-1才行,不然就會越界,可以用4做例子代入就明白了
數(shù)組里存放的是true和false,最后用sum(res)統(tǒng)計數(shù)組中有多少個true就是證明有多少個質(zhì)數(shù)
202. Happy Number
結(jié)果要么最終為1,要么最終陷入循環(huán)。所以用res = set()來存放結(jié)果,因為set()中不包含重復(fù)元素,每次得出結(jié)果后可以堅持結(jié)果是否存在set中,若存在,則返回false。
如何對數(shù)字位進行平方和再相加?將數(shù)字轉(zhuǎn)換為str后就可以進行for循環(huán)。
for i in str(n): sum += int(i)**2
每次得到一個新的n, 若他既不等于1,又不存在set中,就將他添加進去res.add(n)
60. Permutation Sequence
給出數(shù)字n,一共存在n!個全排列。具有同樣起始數(shù)字的排列就有(n-1)!個,因為n中每個數(shù)字都會作為起始數(shù)字。
先將n存進數(shù)組中
while n>=1: group = k / factorial(n-1)
......k = k%factorial(n-1)
(如果K大于0:我們想要找的第k個排列在有序的全排列中屬于第group+1組。因為數(shù)組從0開始計數(shù),所以直接以group為下標(biāo)去nums里找相應(yīng)的起始數(shù)字就可以。
如果K小于0: 當(dāng)前數(shù)字是第group個排列的最后一個數(shù)字,it's the last element of (group)th group, 此時group要減1)
.....if k >0: res.append(str(nums[group])) nums.remove(nums[group]) else: res.append(str(nums[group-1])) nums.remove(nums[group]) n -= 1
return ''.join(res)
remove 是為了防止之后又訪問到這個元素