2026世界杯竞猜中国官网 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。
2026FIFA世界杯赛事官网入口一、合座解题中枢念念路先梳理
题目要求:给定数字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,2026世界杯竞猜(中国)官网最终总共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;
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科普著述、器用评测、普及效果的隐秘以及行业瞻念察。
迎接关心“福大大架构师逐日一题”2026世界杯竞猜中国官网,发音书可取得口试尊府,让AI助力您的翌日发展。

备案号: