代码重构 【Github Actions】

This commit is contained in:
github-actions[bot]
2021-07-23 15:44:19 +00:00
parent c79cac3d9c
commit f671c90754
94 changed files with 1609 additions and 2111 deletions

View File

@@ -1,6 +1,6 @@
# 我太喜欢这个题了
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
@@ -44,19 +44,15 @@
我们假设 n = abcd某个四位数
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/1的次数1.1s5l5k3qy3y8.png)
那我们完全可以统计每一位上 1 出现的次数个数上 1 出现的次数十位上 1 出现的次数百位 千位
也就是说**小于等于 n 的所有数字中**个位上出现 1 的次数 + 十位出现 1 的次数 + 最后得到的就是总的出现次数
见下图
我们假设 n = 13 (用个小点的数比较容易举例)
我们假设 n = 13 (用个小点的数比较容易举例)
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/1的次数2.1horkktykr7k.png)
@@ -69,18 +65,13 @@
> 另外我们发现 11 这个数会被统计 2 它的十位和个位都为 1
>
> 而我们这个题目是要统计 1 出现的次数而不是统计包含 1 的整数所以上诉方法不会出现重复统计的情况
>
我们题目已经有大概思路啦下面的难点就是如何统计每一位中 1 出现的次数呢
我们完全可以通过遍历 n 的每一位来得到总个数见下图
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/1的次数3.21nr01qnlz40.png)
假设我们想要得到十位上 1 出现的次数当前我们指针指向十位
我们称之为当前位num 则代表当前位的位因子当前位为个位时 num = 1十位时为 10百位时为 100....
@@ -95,7 +86,7 @@
>
> 该比喻来自与网友 ryan0414看到的时候不禁惊呼可太贴切了
### **n = 1004**
### **n = 1004**
我们想要计算出**小于等于 1004 的非负整数中**十位上出现 1 的次数
@@ -103,13 +94,13 @@
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/位数1.2x7xcbxtkjo0.png)
> 解析为什么我们可以直接通过高位数字 * num得到 1 出现的次数
> 解析为什么我们可以直接通过高位数字 \* num得到 1 出现的次数
>
> 因为我们高位为 10可变范围为 0 ~ 10但是我们的十位为 0 所以高位为 10 的情况取不到所以共有 10 种情况
>
> 又当前位为十位低位共有 1 可选范围为 0 ~ 9 共有 10 种情况所以直接可以通过 10 * 10 得到
> 又当前位为十位低位共有 1 可选范围为 0 ~ 9 共有 10 种情况所以直接可以通过 10 \* 10 得到
其实不难理解我们可以设想成行李箱的密码盘在一定范围内也就是上面的 0010 ~ 0919 固定住一位为 1 只能移动其他位看共有多少种组合
其实不难理解我们可以设想成行李箱的密码盘在一定范围内也就是上面的 0010 ~ 0919 固定住一位为 1 只能移动其他位看共有多少种组合
好啦这个情况我们已经搞明白啦下面我们看另一种情况
@@ -119,21 +110,21 @@
也就是当前位为十位数字为 1 十位上出现 1 的次数
我们在小于 1014 的非负整数中十位上为 1 的最小数字为 10最大数字为 1014所以我们需要在 10 ~ 1014 这个范围内固定住十位上的 1 移动其他位
我们在小于 1014 的非负整数中十位上为 1 的最小数字为 10最大数字为 1014所以我们需要在 10 ~ 1014 这个范围内固定住十位上的 1 移动其他位
其实然后我们可以将 1014 看成是 1004 + 10 = 1014
则可以将 10 ~ 1014 拆分为两部分 0010 ~ 0919 小于 1004 1010 ~ 1014
则可以将 10 ~ 1014 拆分为两部分 0010 ~ 0919 小于 1004 1010 ~ 1014
见下图
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/次数为1十位.4e6s2zqwtsw0.png)
> 解析为什么我们可以直接通过 高位数字 * num + 低位数字 + 1 10 * 10 + 4 + 1
> 解析为什么我们可以直接通过 高位数字 _ num + 低位数字 + 1 10 _ 10 + 4 + 1
>
> 得到 1 出现的次数
>
> 高位数字 * num 是得到第一段的次数第二段为 低位数字 + 1求第二段时我们高位数字和当前位已经固定
> 高位数字 \* num 是得到第一段的次数第二段为 低位数字 + 1求第二段时我们高位数字和当前位已经固定
>
> 我们可以改变的只有低位
@@ -147,11 +138,9 @@
我们也可以将其拆成两段 0010 ~ 09191010 ~ 1019
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/高位.1wn8di6g1t6.png)
> 解析为什么我们可以直接通过高位数字 * num + num 10 * 10 + 10 得到 1 出现的次数
> 解析为什么我们可以直接通过高位数字 _ num + num 10 _ 10 + 10 得到 1 出现的次数
>
> 第一段和之前所说一样第二段的次数我们此时已经固定了高位和当前位当前位为 1低位可以随意取值上诉例子中当前位为 10低位为位数为 1则可以取值 0 ~ 9 的任何数则共有 10 (num) 种可能
@@ -161,12 +150,10 @@
> 蓝色高位橙色当前位绿色低位
>
> 初始化low = 0 cur = n % 10, num = 1, count = 0, high = n / 10;
> 初始化low = 0 cur = n % 10, num = 1, count = 0, high = n / 10;
![1的个数](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/1的个数.5yccejufzc80.gif)
好啦下面我们看一下题目代码吧
下方代码没有简写也都标有注释大家可以结合动画边思考边阅读
@@ -225,7 +212,7 @@ class Solution {
}
```
时间复杂度 : O(logn) 空间复杂度 O(1)
时间复杂度 : O(logn) 空间复杂度 O(1)
C++ Code:
@@ -260,4 +247,4 @@ public:
return count;
}
};
```
```