LeetCode刷题记录(十):统计各位数字都不同的数字个数


theme: smartblue

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

统计各位数字都不同的数字个数

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

这道题目基本上就是数学题,掰手指估计都能算出来。

题目提供素材

本道题目提供的素材很精炼,只有一个整数变量n。

注:没有那么多的提示,只有一个n的参数范围:[0,8]。

我的解读

一个整数,要保证每一位数字都不一样,才能被统计下来。

比如:12,13;而11就不行。

再比如1,2,3都符合这个标准。

解题思路

我在看到这道题的时候,其实是没什么思路的,脑袋里面一团浆糊。

暴力美学好像也不太好,那可能是要遍历千万次才能得到最终的结果。

只有看看大佬们写的代码,在一番粘贴复制之后,我好像明白了。

大概有这么几个稍微费脑子的步骤,搞清这几个,保证你数学不及格也能想明白写出来。

  1. 排除n=0,n=1的情况,这两种情况都能直接判断出来相应的符合规则的数量。这里我觉得可以直接将n=2也排除掉,因为n=2时,无非也就是那么几个特殊值,更何况例子里面都给出来了。

  2. 当n>2时,那么就出现了另外一种特殊情况,比如122,233,455等等不符合规则的数字,那么要想排除这些数字其实并不容易,要循环很多次的。

我们主要是要解决第二步的,既然无法通过常规方法一个个的去判断,那么就换个思路。

去反向考虑,直接计算出几个数字能拼出多少个符合规则的数字。

就比如,1,2,3;可以拼成123,213,321,312等等,这样通过循环的方式就可以计算出来了。

代码

具体执行代码如下:

java class Solution { public int countNumbersWithUniqueDigits(int n) { if (n == 0) { return 1; } if (n == 1) { return 10; } int resultNum = 10; int cur = 9; for (int i = 0; i < n - 1; i++) { cur = cur * (9 - i); resultNum += cur; } return resultNum; } }

另一个方案

我看到一个大佬直接就把n=1到n=8的结果算出来了,直接就拿出来,感觉这个逻辑也非常棒,毕竟这种情况人力算也很快。

如果是真实的场景,也不用每次都去计算。

代码如下:

java class Solution { public int countNumbersWithUniqueDigits(int n) { return new int[]{1,10,91,739,5275,32491,168571,712891,2345851}[n]; } }

执行结果

执行结果如下图所示:

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值