网易首页 > 网易号 > 正文 申请入驻

2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1

0
分享至

2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。

答案2023-07-11:

函数的主要思路如下:

1.若n小于等于10,则直接返回0,因为在[1, 10]范围内不存在重复数字的情况。

2.计算n的位数和偏移量。首先计算n的位数和一个偏移量offset,其中偏移量初始值为1,算法通过迭代计算tmp = n / 10的商,直到商为0为止,每次迭代位数加1,偏移量乘以10。

3.计算每个长度的非重复数字的个数。通过一个辅助函数计算不同位数下,每个位都是唯一的数字的个数,并将其累加到变量noRepeat上。

numAllLength

4.计算长度为len的非重复数字的个数。当长度小于等于10时,通过包含位运算的算法进行计算,具体步骤如下:

4.1.初始化一个十进制数status为2^10-1,二进制表示为0b1111111111,用于标记当前数字的可用状态,初始状态为每位都可用。(1表示不可用,0表示可用)

4.2.根据n的位数和偏移量计算出n除以offset的商,即当前数字的最高位first。

4.3.将分三种情况:

4.3.1.若first大于0,则对于0到first-1的数字cur,如果status的第cur位为1,说明该数字可用,将offset/10和status的第cur位取反异或,并调用辅助函数计算剩余位和可用状态下的数字个数,将结果累加到变量ans上。

numberRest

4.3.2.若first等于0,则直接跳过该步骤。

4.3.3.若first在0到9之间,则如果status的第first位为1,说明该数字可用,将offset/10和status的第first位取反异或,并调用递归函数计算剩余位和可用状态下的数字个数,将结果累加到变量ans上。

process

5.最后的结果为n加1减去noRepeat,即在[1, n]范围内至少有1位重复数字的正整数的个数。

该代码在给定正整数n的范围内采用了一种比较高效的算法,通过一系列的位运算和迭代计算,找出了每个位数下非重复数字的个数,然后根据n的位数和偏移量来计算在该位数下包含至少1位重复数字的正整数的个数,并将它们相加得出最终结果。

该代码的时间复杂度为O(log10(n) * 2 ^ 10),其中n是输入的正整数。主要消耗时间的是计算每个位数下非重复数字的个数,该计算的时间复杂度为O(log10(n)),而计算每个长度为len的非重复数字的个数的时间复杂度为O(2 ^ len)。因为长度为len的数字有2 ^ len个,所以计算每个长度为len的非重复数字的个数的时间复杂度为O(2 ^ len)。

该代码的空间复杂度为O(1),因为它只使用了常量级的额外空间来保存一些临时变量,不随输入规模的增长而增加。

go完整代码如下:

packagemain
import(
"fmt"
)
funcnumDupDigitsAtMostN(nint)int{
ifn<=10{
return0
}
//Calculatethelengthofnandtheoffset
len,offset:=1,1
tmp:=n/10
fortmp>0{
len++
offset*=10
tmp/=10
}
//Calculatethecountofnon-repeatingnumbersofeachlength
noRepeat:=0
fori:=1;inoRepeat+=numAllLength(i)
}
//Calculatethecountofnon-repeatingnumbersforlengthlen
iflen<=10{
status:=0b1111111111
noRepeat+=((n/offset)-1)*numberRest(offset/10,status^1)
noRepeat+=process(offset/10,status^(1<<(n/offset)),n)
}
returnn+1-noRepeat
}
//Returnsthecountofnumberswhereeachdigitisuniqueforagivenlength
funcnumAllLength(lenint)int{
iflen>10{
return0
}
iflen==1{
return10
}
ans,cur:=9,9
forlen--;len>0;len--{
ans*=cur
cur--
}
returnans
}
//Returnsthecountofnumberswheretheremainingdigitsareunique
funcprocess(offset,status,nint)int{
ifoffset==0{
return1
}
ans:=0
first:=(n/offset)%10
forcur:=0;curif(status&(1<ans+=numberRest(offset/10,status^(1<}
}
if(status&(1<ans+=process(offset/10,status^(1<}
returnans
}
//Returnsthecountofnumberswithremaininglengthandavailabledigits
funcnumberRest(offset,statusint)int{
c:=hammingWeight(status)
ans:=1
foroffset>0{
ans*=c
c--
offset/=10
}
returnans
}
//Returnsthenumberofsetbits(1s)inabinaryrepresentation
funchammingWeight(nint)int{
n=(n&0x55555555)+((n>>1)&0x55555555)
n=(n&0x33333333)+((n>>2)&0x33333333)
n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f)
n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff)
n=(n&0x0000ffff)+((n>>16)&0x0000ffff)
returnn
}
funcmain(){
n:=1000
result:=numDupDigitsAtMostN(n)
fmt.Println(result)
}

rust完整代码如下:

pubfnnum_dup_digits_at_most_n(n:i32)->i32{
ifn<=10{
return0;
}
letlen=get_length(n);
letmutoffset=1;
letmuttmp=n/10;
whiletmp>0{
offset*=10;
tmp/=10;
}
letmutno_repeat=0;
foriin1..len{
no_repeat+=num_all_length(i);
}
iflen<=10{
letstatus=0b1111111111;
no_repeat+=((n/offset)-1)*number_rest(offset/10,status^1);
no_repeat+=process(offset/10,status^(1<<(n/offset)),n);
}
n+1-no_repeat
}
fnget_length(n:i32)->i32{
letmutlen=1;
letmuttmp=n/10;
whiletmp>0{
len+=1;
tmp/=10;
}
len
}
fnnum_all_length(len:i32)->i32{
iflen>10{
return0;
}
iflen==1{
return10;
}
letmutans=9;
letmutcur=9;
letmutlen=len-1;
whilelen>0{
ans*=cur;
cur-=1;
len-=1;
}
ans
}
fnprocess(offset:i32,status:i32,n:i32)->i32{
ifoffset==0{
return1;
}
letmutans=0;
letfirst=(n/offset)%10;
forcurin0..first{
if(status&(1<ans+=number_rest(offset/10,status^(1<}
}
if(status&(1<ans+=process(offset/10,status^(1<}
ans
}
fnnumber_rest(offset:i32,status:i32)->i32{
letmutc=hamming_weight(status);
letmutans=1;
letmutoffset=offset;
whileoffset>0{
ans*=c;
c-=1;
offset/=10;
}
ans
}
fnhamming_weight(mutn:i32)->i32{
n=(n&0x55555555)+((n>>1)&0x55555555);
n=(n&0x33333333)+((n>>2)&0x33333333);
n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);
n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);
n=(n&0x0000ffff)+((n>>16)&0x0000ffff);
n
}
fnmain(){
letn=1000;
letresult=num_dup_digits_at_most_n(n);
println!("Result:{}",result);
}

c++完整代码如下:

#include
#include
intnumAllLength(intlen);
intprocess(intoffset,intstatus,intn);
intnumberRest(intoffset,intstatus);
inthammingWeight(intn);
intnumDupDigitsAtMostN(intn){
if(n<=10){
return0;
}
intlen=1;
intoffset=1;
inttmp=n/10;
while(tmp>0){
len++;
offset*=10;
tmp/=10;
}
intnoRepeat=0;
for(inti=1;inoRepeat+=numAllLength(i);
}
if(len<=10){
intstatus=0b1111111111;
noRepeat+=((n/offset)-1)*numberRest(offset/10,status^1);
noRepeat+=process(offset/10,status^(1<<(n/offset)),n);
}
returnn+1-noRepeat;
}
intnumAllLength(intlen){
if(len>10){
return0;
}
if(len==1){
return10;
}
intans=9;
intcur=9;
while(--len>0){
ans*=cur;
cur--;
}
returnans;
}
intprocess(intoffset,intstatus,intn){
if(offset==0){
return1;
}
intans=0;
intfirst=(n/offset)%10;
for(intcur=0;curif((status&(1<ans+=numberRest(offset/10,status^(1<}
}
if((status&(1<ans+=process(offset/10,status^(1<}
returnans;
}
intnumberRest(intoffset,intstatus){
intc=hammingWeight(status);
intans=1;
while(offset>0){
ans*=c;
c--;
offset/=10;
}
returnans;
}
inthammingWeight(intn){
n=(n&0x55555555)+((n>>1)&0x55555555);
n=(n&0x33333333)+((n>>2)&0x33333333);
n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);
n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);
n=(n&0x0000ffff)+((n>>16)&0x0000ffff);
returnn;
}
intmain(){
intn=1000;
intresult=numDupDigitsAtMostN(n);
std::cout<<"Result:"<return0;
}

c完整代码如下:

#include
#include
intnumAllLength(intlen);
intprocess(intoffset,intstatus,intn);
intnumberRest(intoffset,intstatus);
inthammingWeight(intn);
intnumDupDigitsAtMostN(intn){
if(n<=10){
return0;
}
intlen=1;
intoffset=1;
inttmp=n/10;
while(tmp>0){
len++;
offset*=10;
tmp/=10;
}
intnoRepeat=0;
for(inti=1;inoRepeat+=numAllLength(i);
}
if(len<=10){
intstatus=0b1111111111;
noRepeat+=((n/offset)-1)*numberRest(offset/10,status^1);
noRepeat+=process(offset/10,status^(1<<(n/offset)),n);
}
returnn+1-noRepeat;
}
intnumAllLength(intlen){
if(len>10){
return0;
}
if(len==1){
return10;
}
intans=9;
intcur=9;
while(--len>0){
ans*=cur;
cur--;
}
returnans;
}
intprocess(intoffset,intstatus,intn){
if(offset==0){
return1;
}
intans=0;
intfirst=(n/offset)%10;
for(intcur=0;curif((status&(1<ans+=numberRest(offset/10,status^(1<}
}
if((status&(1<ans+=process(offset/10,status^(1<}
returnans;
}
intnumberRest(intoffset,intstatus){
intc=hammingWeight(status);
intans=1;
while(offset>0){
ans*=c;
c--;
offset/=10;
}
returnans;
}
inthammingWeight(intn){
n=(n&0x55555555)+((n>>1)&0x55555555);
n=(n&0x33333333)+((n>>2)&0x33333333);
n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);
n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);
n=(n&0x0000ffff)+((n>>16)&0x0000ffff);
returnn;
}
intmain(){
intn=1000;
intresult=numDupDigitsAtMostN(n);
printf("Result:%d\n",result);
return0;
}

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
5行代码,逼疯整个硅谷!澳洲放羊大叔,捅开AI编程奇点

5行代码,逼疯整个硅谷!澳洲放羊大叔,捅开AI编程奇点

新智元
2026-01-14 17:38:10
美国将暂停75国的签证,其中哪些国让人意外?哪些人受影响最大?

美国将暂停75国的签证,其中哪些国让人意外?哪些人受影响最大?

之乎者也小鱼儿
2026-01-15 01:28:32
伊朗处于最高战备状态!未排除动武可能,特朗普:将“观望”局势发展!欧洲多国敦促其公民离开伊朗

伊朗处于最高战备状态!未排除动武可能,特朗普:将“观望”局势发展!欧洲多国敦促其公民离开伊朗

每日经济新闻
2026-01-15 06:30:06
美媒:美国将暂停对75个国家的所有签证

美媒:美国将暂停对75个国家的所有签证

新华社
2026-01-14 22:40:07
赃款超83%来自境外,不法商人充当李勇“白手套”

赃款超83%来自境外,不法商人充当李勇“白手套”

极目新闻
2026-01-14 20:22:36
闫学晶被举报偷税后:官方评论区被冲,海南税务受牵连,网友炸锅

闫学晶被举报偷税后:官方评论区被冲,海南税务受牵连,网友炸锅

天天热点见闻
2026-01-15 07:00:55
伊朗首席大法官表示快速诉讼和处决示威者

伊朗首席大法官表示快速诉讼和处决示威者

一种观点
2026-01-14 19:16:39
中国队出线仅1小时,连获2个利好!1/4决赛时间确定,进四强有戏

中国队出线仅1小时,连获2个利好!1/4决赛时间确定,进四强有戏

侃球熊弟
2026-01-14 23:00:06
吴艳妮参加品牌活动,这身材太壮实了!

吴艳妮参加品牌活动,这身材太壮实了!

马拉松跑步健身
2026-01-14 23:06:38
专机已抵京,卡尼对台叫停一件事,大陆发布照会,民进党连犯4错

专机已抵京,卡尼对台叫停一件事,大陆发布照会,民进党连犯4错

时时有聊
2026-01-14 19:33:23
一场0:0验出U23国足两大水货 表现平庸难堪大用 打乌兹别克慎用

一场0:0验出U23国足两大水货 表现平庸难堪大用 打乌兹别克慎用

零度眼看球
2026-01-15 09:08:47
阿森纳3-2切尔西!进英联杯决赛占先机 加纳乔双响 哲凯赖什传射

阿森纳3-2切尔西!进英联杯决赛占先机 加纳乔双响 哲凯赖什传射

我爱英超
2026-01-15 06:03:10
人去楼空,杉杉集团上海总部大楼流拍后降价4.5亿

人去楼空,杉杉集团上海总部大楼流拍后降价4.5亿

财视传播
2026-01-14 10:40:22
特朗普对镜头竖“中指”,美国总统的首次,原因是什么?

特朗普对镜头竖“中指”,美国总统的首次,原因是什么?

世家宝
2026-01-14 23:18:01
ESPN预测全明星:五大国际巨星锁定首发 杜兰特库里替补詹皇落选

ESPN预测全明星:五大国际巨星锁定首发 杜兰特库里替补詹皇落选

罗说NBA
2026-01-15 05:26:35
闫学晶事件迎来反转!林傲霏中戏毕业照曝光,中戏欺骗了所有考生

闫学晶事件迎来反转!林傲霏中戏毕业照曝光,中戏欺骗了所有考生

阿纂看事
2026-01-14 16:41:41
猛降至7℃!广州大降温时间确认

猛降至7℃!广州大降温时间确认

鲁中晨报
2026-01-15 07:15:29
拔萝卜出泥!学历还没查清,闫学晶再迎噩耗,多位大V锤她恐坐牢

拔萝卜出泥!学历还没查清,闫学晶再迎噩耗,多位大V锤她恐坐牢

李健政观察
2026-01-14 15:01:13
“等生了孩子”“等还完房贷”,网友质疑!最新:广告已换下

“等生了孩子”“等还完房贷”,网友质疑!最新:广告已换下

南方都市报
2026-01-14 09:18:34
中戏院长落马,牵出明星暗线!寒门艺考生的前路究竟在哪里?

中戏院长落马,牵出明星暗线!寒门艺考生的前路究竟在哪里?

垛垛糖
2026-01-14 20:33:18
2026-01-15 11:39:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1100文章数 53关注度
往期回顾 全部

科技要闻

反垄断大棒,为何砸向了携程

头条要闻

美国开售委内瑞拉石油 首笔交易价值5亿美元

头条要闻

美国开售委内瑞拉石油 首笔交易价值5亿美元

体育要闻

你是个好球员,我们就拿你交易吧

娱乐要闻

传奇棋圣聂卫平离世,网友集体悼念

财经要闻

“疯狂的白银”,还能走多远?

汽车要闻

今年推出超40款新车,BBA要把失去的夺回来

态度原创

家居
健康
艺术
旅游
军事航空

家居要闻

心之所向 现代建构之美

血常规3项异常,是身体警报!

艺术要闻

历代书家集字春联大集合

旅游要闻

定格冬日浪漫 济南九如山冰瀑奇观如梦幻

军事要闻

中东气氛愈发紧张 伊朗处于最高战备状态

无障碍浏览 进入关怀版