为何LeetCode与PyCharm、Jupyter Notebook运行结果不一致?
Permutation Sequence 代码本地与LeetCode运行结果不一致问题
我在解决Permutation Sequence问题时碰到了个怪事:同样的代码,本地PyCharm和Jupyter Notebook输入n=3、k=3能得到正确结果,但放到LeetCode上跑结果就不对了。
我提交的LeetCode代码
class Solution(object): def getPermutation(self, n, k): list_ = [] my_num = '' for i in range(n): list_.append(str(i + 1)) fact = 1 n_f = n k_f = k for i in range(n_f): fact *= (i+1) diveded = int(fact/n_f) if n_f == n: no = (k/diveded) if int(no) == no: no -= 1 no = int(no) else: no = int(no) my_num += list_[no] list_.remove(list_[no]) n_f -= 1 while len(my_num) < n: fact = 1 for i in range(n_f): fact *= (i + 1) no_ = int((k_f-1)%diveded) no = int(no_/fact) if int(no) == no and no_ > 0: no -= 1 no = int(no) else: no = int(no) used = 0 for i in range(len(my_num)): if int(my_num[i]) < int(list_[no]) and no > 0: used += 1 no -= used diveded = int(fact / n_f) while list_[no] in my_num: no += 1 else: my_num += list_[no] list_.remove(list_[no]) n_f -= 1 else: return my_num solu = Solution() print(solu.getPermutation(3,3))
运行结果对比
- 本地运行结果:

- LeetCode运行结果:

问题原因及修复方案
问题根源
- Python版本差异:你本地大概率用的是Python 3,
/会返回浮点数;但LeetCode如果用Python 2环境,/是整数除法,这直接导致你代码里的索引计算逻辑出错。 - 冗余逻辑干扰:代码里的
used计算、while list_[no] in my_num这类逻辑完全没必要,反而容易引入索引错误;同时diveded变量没有正确更新,导致后续的余数计算偏离预期。
修复后的代码
class Solution(object): def getPermutation(self, n, k): from math import factorial nums = list(map(str, range(1, n+1))) k -= 1 # 转成0索引,适配数组操作 result = [] for i in range(n, 0, -1): fact = factorial(i-1) index = k // fact result.append(nums.pop(index)) k = k % fact return ''.join(result)
逻辑说明
- 用
math.factorial直接计算阶乘,避免手动循环计算的出错概率。 - 将k减1转为0索引,这样可以直接用数组索引来定位当前要选的数字,不用再处理复杂的整除判断。
- 每次循环计算剩余数字的排列数(阶乘),用
k // fact得到当前数字在剩余列表中的索引,弹出该数字加入结果,再用k % fact更新k,处理剩余的排列部分。
这个版本逻辑清晰,不管在Python 2还是3环境下都能稳定运行,完全解决了本地和LeetCode结果不一致的问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

