当前位置: 代码迷 >> 综合 >> 1492 n 的第 k 个因子(暴力破解、分析)
  详细解决方案

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

热度:50   发布时间:2024-01-30 08:04:38.0

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