算法刷题计划一----无主题随机刷题3(leetCode)

7. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

class Solution {
public:
    int reverse(int x) {
        double c;
        int y=0;
        do
        {
            if(y>(pow(2,31)-1)/10||y<-1*pow(2,31)/10)
                return 0;
            y=y*10+x%10;
            x=x/10;
        }while(x);   
        return y;
    }
};

个人总结: 虽然简单,但是也有小细节,当乘10溢出时,可以反过来用除10判断。

233. 数字 1 的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例 1:

输入:n = 13
输出:6

示例 2:

输入:n = 0
输出:0
递归思路
假设数为426,最高位为4(>1),四个100里有的1为pow(10,2)+4pow(10,2-1)2,除去最高位,递归计算低位数。若最高位<=
1,则返回n-x
pow(10,c)+1+countDigitOne(x
pow(10,c)-1)+countDigitOne(n-xpow(10,c));假设为123
n-x
pow(10,c)+1是最高位为1则有23+1(100是多出来的1)个1,countDigitOne(xpow(10,c)-1)返回99的1,countDigitOne(n-xpow(10,c))为23的1。这边的23和99不是23包含在99里了。因为这个函数是运行一次去掉最高位,然后递归。所以当我们算百位为1时,23个三位数都有一个1,但这个时候我们不能直接去掉最高位1,因为百以内的还没处理,所以要加一个countDigitOne(xpow(10,c)-1)算百以内的,再去掉最高位加countDigitOne(n-xpow(10,c))。

class Solution {
public:
    int countDigitOne(int n) {
        int x=n,c=0;
        while(x/10)//x为最高位
        {
            x=x/10;
            c++;//c为最高位在第几位
        }
        if(x>1)
        {
            if(c==0)
                return 1;
            else
                return pow(10,c)+x*pow(10,c-1)*c+countDigitOne(n-x*pow(10,c));
        }else
        {
            if(x==1&&c==0)
                return 1;
            else if(x==0)
                return 0;
            else
            {
                return n-x*pow(10,c)+1+countDigitOne(x*pow(10,c)-1)+countDigitOne(n-x*pow(10,c));
            }
        }
        
    }
};

个人总结: 完全是自己打草稿,根据规律凑出递归来了。感觉思路还是不够清晰,也不熟练,要多练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值