真人棋牌

kaiyun sports 2026-06-19: 阶数数字排列。用go话语, 给定一个整数 n, 判断能否

发布日期:2026-06-20 07:27    点击次数:95

kaiyun sports 2026-06-19: 阶数数字排列。用go话语, 给定一个整数 n, 判断能否

2026-06-19:阶数数字排列。用go话语,给定一个整数 n,判断能否把 n 的列位数字重新排列(允许使用正本的律例,也允许换成自便律例),得到某个灵验整数,使得它餍足底下的性质:

• 对这个新整数的每一位数字 d,计较 d!(d 的阶乘)。

• 把悉数位数字的阶乘终结相加。

• 若是这个“位数字阶乘之和”碰劲即是该整数自己,则这个整数称为“阶数数字”。

要求研究悉数排列的可能性,但排列必须是灵验的:不不错 0 起首(不然该排列视为无效)。

若是存在至少一种灵验排列能酿成阶数数字,复返 true;不然复返 false。

1

输入: n = 145。

输出: true。

诠释注解:

数字 145 自己是一个阶数数字,因为 1! + 4! + 5! = 1 + 24 + 120 = 145。因此,谜底为 true。

题目来独力扣3848。

一、举座解题中枢想路先梳理

题目要求:给定数字n,把它所稀罕字作念不含前导0的排列,唯独自便一个排列x餍足「x每一位阶乘相加 = x自己」,就复返true。

中枢数学关节点:

1. 岂论数字若何排列,列位数字集中不变 → 列位数字阶乘的总和S是固定值,和排列律例无关;

2. 假定某排列x是正当阶数数字,则势必餍足 x = S;

3. 扩充:惟一有可能顺应条目的候选数字,只然则列位阶乘总和S。只需要考据两件事:

① S的数字多重集中 和 原数字n的数字多重集中十足疏导(即互为排列);

② S不不错0起首(S自身当然不会前导0,因为是正常整数)。

原代码十足基于这个扩充收场,不需要排列悉数排列,极大缩短复杂度。

二、分设施防御拆解实践经过(以输入n=145例如)

设施1:全局预惩处0~9的阶乘数组(init函数预测算,纪律启动只实践一次)

1. 界说长度为10的数组fac,驱动fac[0]=1(数学章程0! = 1);

2. 轮回i从1到9,瓜代计较每个数字的阶乘:

• fac[1] = fac[0] * 1 = 1! = 1

• fac[2] = fac[1] * 2 = 2! = 2

• fac[3] = 6、fac[4]=24、fac[5]=120……直到fac[9]=362880;

3. 作用:后续取数字d时,径直查表拿d!,毋庸一样计较阶乘。

设施2:参加判断函数 isDigitorialPermutation(n int),分三大阶段

阶段A:遍历原数字n的每一位,完成两件事:累加阶乘和、统计数字出现次数

输入示例n=145,轮回条目 n>0,每次对10取模取个位,再除以10截断:

1. 驱动化两个变量:

• sumFac:存储悉数位阶乘累加和,驱动0;

• cnt[10]数组:长度10,纪录0-9每个数字在原数里出现的次数,驱动全0;

2. 第一轮 n=145:

d = 145 % 10 = 5;sumFac += fac[5]=120 → sumFac=120;cnt[5] +=1 → cnt[5]=1;n更新为14;

3. 第二轮 n=14:

d=14=4;sumFac += fac[4]=24 → sumFac=144;cnt[4] +=1 → cnt[4]=1;n更新为1;

4. 第三轮 n=1:

d=1=1;sumFac += fac[1]=1 → sumFac=145;cnt[1] +=1 → cnt[1]=1;n更新为0;

5. 轮回绝交;

此时得到:

• sumFac = 145(所稀罕字阶乘总和);

• cnt数组纪录原数字:1出现1次、4出现1次、5出现1次,其尾数字0次。

阶段B:遍历候选数字sumFac的每一位,对消cnt数组计数

中枢逻辑:若是sumFac和原数n是数字重排列,那么两者每个数字出现次数十足相配,遍历sumFac每一位,对应cnt数字计数减1,开云体育(kaiyun)官方网站最终悉数cnt必须归零。

轮回条目 sumFac>0,每次取个位、除以10:

1. 第一轮 sumFac=145:个位5 → cnt[5] -=1 → cnt[5]=0;sumFac=14;

2. 第二轮 sumFac=14:个位4 → cnt[4] -=1 → cnt[4]=0;sumFac=1;

3. 第三轮 sumFac=1:个位1 → cnt[1] -=1 → cnt[1]=0;sumFac=0;

4. 轮回绝交;

阶段C:校验cnt数组是否通盘为0,复返布尔终结

1. 对比cnt数组和全零数组[10]int{0,0,...0};

2. 示例中悉数位置齐是0,等式建立,复返true;

补充反例:若原数是146,sumFac=1!+4!+6! = 1+24+720=745;遍历745会给cnt[7]、cnt[4]、cnt[5]减1,原cnt是1、4、6各一次,最终数组存在非0数字,复返false。

设施3:main函数实践经过

1. 给定输入n=145;

2. 调用判断函数,秉承复返布尔值;

3. 打印输出终结true。

三、补充鸿沟逻辑诠释(题目欺压n∈[1,1e9])

1. 前导0校验:本算法自然侧目无效排列问题。

若存在正当无0起首排列x餍足条目,则x=sumFac,sumFac是昔日正整数,自己不可能以0起首;

若sumFac首位为0,只然则sumFac=0,但n≥1,原数字至少有1个非0数字,sumFac不可能为0,无需极端判断前导0;

AG真人国际中国官网首页下载

2. 无需排列全排列:成例暴力排列数字排列会产生阶乘级复杂度,本算法哄骗「排列数字阶乘和固定」的数学性质,只校验惟一候选sumFac,十足跳过排列排列。

四、期间复杂度分析

1. 预惩处阶乘(init)

固定轮回0~9,轮回次数恒定10次 → O(1) 常数期间,只实践一次。

2. isDigitorialPermutation 里面两段数字遍历

设输入数字n的位数为k(题目上限1e9,最多10位):

• 遍历原数字n:最多10次轮回 O(k)=O(1);

• 遍历sumFac:单个数字阶乘最大9!=362880,10位数字总和上限 10*362880=3,628,800,最多7位数字,轮回次数最多7次 O(1);

• 数组相配对比:固定长度10的数组逐元素比拟,10次操作 O(1);

举座单次判断函数期间:O(1),与输入数值大小无关。

全局总期间复杂度:O(1)(常数级)。

五、极端空间复杂度分析

极端诱惑的存储空间:

1. 全局fac数组:固定长度10,O(1);

2. 函数内cnt数组:固定长度10,O(1);

3. 局部变量sumFac、d、轮回计数器:单个int变量,常数空间;

不存在随输入长度增长的动态数组、切片、递归栈等。

总数外空间复杂度:O(1)(常数空间)。

Go完好代码如下:

package main

import (

"fmt"

)

var fac = [10]int{1}

func init {

// 预惩处阶乘

for i := 1; i

fac[i] = fac[i-1] * i

}

}

func isDigitorialPermutation(n int)bool {

sumFac := 0

cnt := [10]int{}

for ; n > 0; n /= 10 {

d := n % 10

sumFac += fac[d]

cnt[d]++

}

for ; sumFac > 0; sumFac /= 10 {

cnt[sumFac]--

}

// cnt[i] == 0

return cnt == [10]int{}

}

func main {

n := 145

result := isDigitorialPermutation(n)

fmt.Println(result)

}

Python完好代码如下:

# -*-coding:utf-8-*-

# 预惩处阶乘

fac = [1] * 10

for i in range(1, len(fac)):

fac[i] = fac[i-1] * i

def is_digitorial_permutation(n: int) -> bool:

sum_fac = 0

cnt = [0] * 10

# 计较列位数字阶乘之和,并统计列位数字出现次数

temp = n

while temp > 0:

d = temp % 10

sum_fac += fac[d]

cnt[d] += 1

temp //= 10

# 对阶乘和的列位数字,减少对应计数

while sum_fac > 0:

cnt[sum_fac % 10] -= 1

sum_fac //= 10

# 查抄悉数计数是否为 0

return all(c == 0for c in cnt)

def main:

n = 145

result = is_digitorial_permutation(n)

print(result)

if __name__ == "__main__":

main

C++完好代码如下:

#include

#include

using namespace std;

// 预惩处阶乘

array fac;

void initFac {

fac[0] = 1;

for (int i = 1; i

fac[i] = fac[i-1] * i;

}

}

bool isDigitorialPermutation(int n) {

int sumFac = 0;

array cnt = {0};

// 计较列位数字阶乘之和,并统计列位数字出现次数

int temp = n;

while (temp > 0) {

int d = temp % 10;

sumFac += fac[d];

cnt[d]++;

temp /= 10;

}

// 对阶乘和的列位数字,减少对应计数

while (sumFac > 0) {

cnt[sumFac % 10]--;

sumFac /= 10;

}

// 查抄悉数计数是否为 0

for (int i = 0; i

if (cnt[i] != 0) {

returnfalse;

}

}

returntrue;

}

int main {

initFac;

int n = 145;

bool result = isDigitorialPermutation(n);

cout

return0;

}

咱们信服东说念主工智能为昔日东说念主提供了一种“增强器用”,并清贫于共享全标的的AI常识。在这里,您不错找到最新的AI科普著作、器用评测、提高成果的隐讳以及行业细察。

宽宥祥和“福大大架构师逐日一题”kaiyun sports,发讯息可获取口试贵寓,让AI助力您的翌日发展。