1492 n 的第 k 個因子(暴力破解 分析)

2021-10-08 07:31:13 字數 1811 閱讀 4821

1. 問題描述:

給你兩個正整數 n 和 k 。如果正整數 i 滿足 n % i == 0 ,那麼我們就說正整數 i 是整數 n 的因子。考慮整數 n 的所有因子,將它們 公升序排列 。請你返回第 k 個因子。如果 n 的因子數少於 k ,請你返回 -1

示例 1:

輸入:n = 12, k = 3

輸出:3

解釋:因子列表包括 [1, 2, 3, 4, 6, 12],第 3 個因子是 3

示例 2:

輸入:n = 7, k = 2

輸出:7

解釋:因子列表包括 [1, 7] ,第 2 個因子是 7 。

示例 3:

輸入:n = 4, k = 4

輸出:-1

解釋:因子列表包括 [1, 2, 4] ,只有 3 個因子,所以我們應該返回 -1

示例 4:

輸入:n = 1, k = 1

輸出:1

解釋:因子列表包括 [1] ,第 1 個因子為 1 

示例 5:

輸入:n = 1000, k = 3

輸出:4

解釋:因子列表包括 [1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500, 1000] 

2. 思路分析:

第乙個比較容易想到的是一一枚舉1到n這個範圍內的因子,並且在列舉的時候對其計數,發現等於了k那麼返回這個因子即可,第二種做法是官方提供的思路,其中乙個因子是小於等於根號n的,所以我們首先需要乙個迴圈來找出所有小於等於根號n的因子並且進行計數看是否等於了k,假如在這個範圍之內沒有找到,那麼第k個因為可能是大於根號n的那麼使用迴圈進行倒著來進行計算,這樣就可以保持因子的順序了,其實這個思路還是比較好理解的

3. **如下:

class solution:

def kthfactor(self, n: int, k: int) -> int:

count = 0

for i in range(1, n + 1):

if n % i == 0:

count += 1

if k == count: return i

return -1

class solution:

# 只需要遍歷根號n的範圍內的數字即可然後從後面倒數著來計算即可

def kthfactor(self, n: int, k: int) -> int:

factor, count = 1, 0

while factor * factor <= n:

if n % factor == 0:

count += 1

if count == k: return factor

factor += 1

factor -= 1

# 平方的數字只需要計算一次即可

if factor * factor == n: factor -= 1

# 第k個因為可能超過了根號n的所以要倒著計算

while factor > 0:

if n % factor == 0:

count += 1

if count == k: return n // factor

factor -= 1

return -1

1492 n 的第 k 個因子

給你兩個正整數n和k。如果正整數i滿足n i 0,那麼我們就說正整數i是整數n的因子。考慮整數n的所有因子,將它們公升序排列。請你返回第k個因子。如果n的因子數少於k,請你返回 1。示例 1 輸入 n 12,k 3輸出 3解釋 因子列表包括 1,2,3,4,6,12 第 3 個因子是 3 示例 2 ...

1492 n 的第 k 個因子

給你兩個正整數 n 和 k 如果正整數 i 滿足 n i 0 那麼我們就說正整數 i 是整數 n 的因子。考慮整數 n 的所有因子,將它們 公升序排列 請你返回第 k 個因子。如果 n 的因子數少於 k 請你返回 1 1.生成所有存起來,然後判斷,o nlogn 很暴力 2.o n 直接一次迴圈,過...

N5 關於token防止暴力破解的一些問題

token可以作為每次登陸的唯一識別碼,但是有些 在token方面處理不當,導致暴力破解仍然有機可乘。開啟pikachu平台,在token章節,按f12,檢視後台原始碼。用塊選擇器現選擇賬號密碼位置,可以很明顯的找到token。這裡的token是以明碼的方式顯示出來的。雖然每次登入都會跳變一次,但是...