mirror of
https://github.com/chefyuan/algorithm-base.git
synced 2025-08-04 23:02:31 +00:00
[update] #3 数组篇添加C++ Code
This commit is contained in:
@@ -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;
|
||||
}
|
||||
};
|
||||
```
|
Reference in New Issue
Block a user