lc day31

数学问题,今天没有耐心做题。。

剑指 Offer 14- II. 剪绳子 II

思路:之前做过一道题是分成3越多越好,这里类似,但要考虑4 的问题

public int cuttingRope(int n) {
        if(n == 2 || n==3)
            return n-1;
        long sum = 1;
        while (n>4){
            sum *= 3;
            sum = sum%1000000007;
            n -= 3;
        }
        return (int)(sum*n%1000000007);
    }

剑指 Offer 43. 1~n 整数中 1 出现的次数

思路:自己有点缕不明白,看了评论区有点明白了。注意考虑当前位置=1、>1、<1三种情况

//以 3 1 0 1 5 9 2 举例

    /*
     *计算从1-n出现1的总次数
     *就是计算1-n所有整数 个位+十位+百位+..为1的总和

     *下面三个例子,分别对应的位元素 大于1,等于1,等于0 三种情况

     *例一:把百位的5固定 3101 5 92
     *  我们把百位设为1,5前面可以取0-3101,5后面可以取0-99
     *  共有(3101 + 1)* 100(规律是百位即99 + 1)种组合使百位为1
     *
     *例二:把千位的1固定 310 1 592
     *  我们把千位设为1,这里可以分两种情况:
     *  当1前面取310,1后面可以取0-592
     *  当1前面可以取0-309,1后面可以取0-999
     *  共有(309 + 1)* 1000(规律是千位即999 + 1)+(592 + 1)种组合使千位为1

     *例三:把万位的0固定 31 0 1592
     *  把万位设为1, 0前面可以取0-30,0后面可以取0-9999
     *  共有(30 + 1)* 10000(规律是万位即9999 + 1)种组合使万位为1
     
     *我们可以分别计算一个数的个位百位...对应的组合数,最后相加
    */

 

 public int countDigitOne(int n) {
        long base = 1;
        int count = 0;
        while (base <= n){
            int low = (int)(n%base);
            int high = (int) (n/base);
            int cur = high%10;
            high /= 10;
            if (cur > 1){
                count += (high+1)*base;
            }else if (cur == 1){
                count += high*base +(low+1);
            }else {
                count += high*base;
            }
            base *= 10;
        }
        return count;
    }

剑指 Offer 44. 数字序列中某一位的数字

思路:没耐心好好看,改天看

 数字范围    数量  位数    占多少位
    1-9        9      1       9
    10-99      90     2       180
    100-999    900    3       2700
    1000-9999  9000   4       36000  ...

    例如 2901 = 9 + 180 + 2700 + 12 即一定是4位数,第12位   n = 12;
    数据为 = 1000 + (12 - 1)/ 4  = 1000 + 2 = 1002
    定位1002中的位置 = (n - 1) %  4 = 3    s.charAt(3) = 2;
 public int findNthDigit(int n) {
        int digit = 1;   // n所在数字的位数
        long start = 1;  // 数字范围开始的第一个数
        long count = 9;  // 占多少位
        while(n > count){
            n -= count;
            digit++;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (n - 1) / digit;
        return Long.toString(num).charAt((n - 1) % digit) - '0';
    }

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值