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]
提示:
1 <= k <= n <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/the-kth-factor-of-n
2. 思路分析:
第一个比较容易想到的是一一枚举1到n这个范围内的因子,并且在枚举的时候对其计数,发现等于了k那么返回这个因子即可,第二种做法是官方提供的思路,其中一个因子是小于等于根号n的,所以我们首先需要一个循环来找出所有小于等于根号n的因子并且进行计数看是否等于了k,假如在这个范围之内没有找到,那么第k个因为可能是大于根号n的那么使用循环进行倒着来进行计算,这样就可以保持因子的顺序了,其实这个思路还是比较好理解的
3. 代码如下:
class Solution:def kthFactor(self, n: int, k: int) -> int:count = 0for i in range(1, n + 1):if n % i == 0:count += 1if k == count: return ireturn -1
class Solution:# 只需要遍历根号n的范围内的数字即可然后从后面倒数着来计算即可def kthFactor(self, n: int, k: int) -> int:factor, count = 1, 0while factor * factor <= n:if n % factor == 0:count += 1if count == k: return factorfactor += 1factor -= 1# 平方的数字只需要计算一次即可if factor * factor == n: factor -= 1# 第k个因为可能超过了根号n的所以要倒着计算while factor > 0:if n % factor == 0:count += 1if count == k: return n // factorfactor -= 1return -1