[update] #3 数组篇添加C++ Code

This commit is contained in:
caibingcheng
2021-07-20 21:13:10 +08:00
parent 10a7420457
commit 664b801ca9
5 changed files with 215 additions and 30 deletions

View File

@@ -4,7 +4,7 @@
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
今天我们来看一道贼棒的题目题目不长很经典也很容易理解我们一起来看一哈吧
@@ -87,7 +87,7 @@
那我们将**当前位左边的定义为高位****当前位右边的定义位低位**
> n = 1004 此时指针指向十位当前位num = 10高位为百位千位低位为个位
> n = 1004 此时指针指向十位当前位num = 10高位为百位千位低位为个位
而且我们某一位的取值范围为 0 ~ 9,那么我们可以将这 10 个数分为 3 小于 1 当前位数字为 0 等于 1当前位数字为 1 大于 1当前位上数字为 2 ~ 9下面我们就来分别考虑三种情况
@@ -139,7 +139,7 @@
可以继续想到密码盘求第二段时把前 3 位固定只能改变最后一位最后一位最大能到 4 那么共有几种情况
### n = 1024
### n = 1024
我们想要计算出**小于等于 1024 的非负整数中**十位上出现 1 的次数
@@ -187,12 +187,12 @@ class Solution {
while (high != 0 || cur != 0) {
cur = high % 10;
high /= 10;
//这里我们可以提出 high * num 因为我们发现无论为几,都含有它
//这里我们可以提出 high * num 因为我们发现无论为几,都含有它
if (cur == 0) count += high * num;
else if (cur == 1) count += high * num + 1 + low;
else if (cur == 1) count += high * num + 1 + low;
else count += (high + 1) * num;
//低位
low = cur * num + low;
low = cur * num + low;
num *= 10;
}
return count;
@@ -209,10 +209,10 @@ class Solution {
while high != 0 || cur != 0 {
cur = high % 10
high /= 10
//这里我们可以提出 high * num 因为我们发现无论为几,都含有它
//这里我们可以提出 high * num 因为我们发现无论为几,都含有它
if cur == 0 {
count += high * num
} else if cur == 1 {
} else if cur == 1 {
count += high * num + 1 + low
} else {
count += (high + 1) * num
@@ -227,5 +227,37 @@ class Solution {
时间复杂度 : O(logn) 空间复杂度 O(1)
C++ Code:
```C++
class Solution
{
public:
int countDigitOne(int n)
{
// 高位, 低位, 当前位
int high = n, low = 0, cur = 0;
int count = 0, num = 1;
//数字是0的时候完全没必要继续计算
while (high != 0)
{
cur = high % 10;
high /= 10;
//这里我们可以提出 high * num 因为我们发现无论为几,都含有它
if (cur == 0)
count += (high * num);
else if (cur == 1)
count += (high * num + 1 + low);
else
count += ((high + 1) * num);
//低位
low = cur * num + low;
//提前检查剩余数字, 以免溢出
if (high != 0)
num *= 10;
}
return count;
}
};
```