面试题43. 1~n整数中1出现的次数(Java)(思维)

13 篇文章 0 订阅

1 题目

面试题43. 1~n整数中1出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

示例 1:

输入:n = 12
输出:5
示例 2:

输入:n = 13
输出:6

限制:

1 <= n < 2^31
注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/

2 Java

2.1 方法一(思维)

按位遍历n,将第k位固定为1,计算此时高位(k位左侧)和低位(k位右侧)的排列组合,并将所有位的排列组合相加

class Solution {
    public int countDigitOne(int n) {
        // 计算n有几位
        int bits = 0; int temp = n;
        while(temp > 0){
            temp /= 10;
            bits++;
        }
        
        // 遍历位,当k位为1,计算高位和低位共有多少种排列组合,计入总数sum
        int sum = 0;
        for(int k = 1; k <= bits; k++){
            // 不能用字符,当k为最高位or最低位,就没有高位/低位,int计算可以算出0,string截取只能得到空,没法转成int
            // String s = Integer.toString(n);       // 或者String s = String.valueOf(n);
            // int high = Integer.parseInt(s.substring(0, k - 1));
            // int cur = Integer.parseInt(s.substring(k - 1, k));
            // int low = Integer.parseInt(s.substring(k));
            int high = n / (int)Math.pow(10, k);
            int low = n - n / (int)Math.pow(10, k - 1) * (int)Math.pow(10, k - 1);
            int cur = (n - high * (int)Math.pow(10, k) - low) / (int)Math.pow(10, k - 1);
			
			// 根据第k位的值分类,计算公式见代码,还算清晰吧
            if(cur == 0)    sum += (high + 1 - 1) * (int)Math.pow(10, k - 1);
            else if(cur == 1)   sum += 1 * (low + 1) + (high + 1 - 1) * (int)Math.pow(10, k - 1);
            else if(cur > 1)    sum += (high + 1) * (int)Math.pow(10, k - 1);
        }

        return sum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值