2026世界杯竞猜中国官网

热点资讯

你的位置:2026世界杯竞猜中国官网 > 世界杯积分榜 >

2026世界杯竞猜中国官网 2026-06-19: 阶数数字排列。用go言语, 给定一个整数 n, 判断能否

发布日期:2026-06-20 10:53    点击次数:80

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助力您的翌日发展。



我的网站