CSDN每日一练

计数问题

题目描述
试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9) 共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
输入描述
2 个整数 n,x ,之间用一个空格隔开。
输出描述
1 个整数,表示 x 出现的次数。

// javascript
function Solution(n, x){
    this.solution = function (){
        if (n < 1) return 0;
        let count = 0;
        const xStr = x.toString();
        for (let i = 1; i <= n; i++) {
            const nStr = i.toString();
            for (let k=0; k<nStr.length; k++){
                if (xStr === nStr[k]) {
                    count ++;
                }
            }
        }
        console.log(count);
    }
}

s = new Solution(n, x);
s.solution();
# python
class Solution:
    def __init__(self) -> None:
        pass

    def solution(self):
        count = 0
        input_str = input();
        input_list = input_str.split(" ");
        n = input_list[0]
        n_number = int(n)
        x = input_list[1]
        i = 1
        while i<=n_number:
            i_str = str(i)
            for k in i_str:
                if k == x:
                    count = count + 1
            i = i+1
        print(count)
        return count


if __name__ == "__main__":
    s = Solution()
    s.solution()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个数位统计的问题。我们可以将区间内的每个数拆分成个位、十位、百位等等,然后统计每个数位上数字x出现数,最后将所有数位上的数相加即可。 以数字1为例,对于个位上的数字1,我们可以发现,每10个数就有1个数的个位是1。例如,在1到20,有2个数的个位是1,即1和11。在21到30,也有2个数的个位是1,即21和31。因此,在1到n,个位上数字1出现数为n/10*1+(n%10>=1&&n%10<1)*1。 对于十位、百位等等,我们可以采用类似的方法进行统计。最终,所有数位上数字x出现数为各个数位上数字x出现数之和。 具体实现可以使用循环遍历区间内的每个数,然后将每个数拆分成各个数位上的数字,统计数字x在每个数位上出现数,最后将所有数相加即可。 ### 回答2: 本题可以通过计算每个数位上出现x的数来掌握该数字区间1到n出现数。设当前计算的位数为第i位,低位为a,高位为b,则有以下三种情况: 1. a < x,即第i位小于x,那么第i位上出现x的数只受高位b的影响。比如,在计算数字1在1到11出现数时,第一位是1,低位为0,高位为1,此时第一位上出现1的数只受高位1的影响,即在10到19之间,第一位上出现1的数为10。 2. a = x,即第i位等于x,那么第i位上出现x的数不仅受高位b的影响,还要受低位a的影响。比如,在计算数字1在1到11出现数时,第二位也是1,此时第二位上出现1的数受高位1和低位0的影响,即在1到9之间,第二位上出现1的数为2。 3. a > x,即第i位大于x,那么第i位上出现x的数只受高位b的影响。比如,在计算数字1在1到11出现数时,第二位是0,低位为1,高位为1,此时第二位上出现1的数只受高位1的影响,即在10到19之间,第二位上出现1的数为10。 综上所述,我们可以得到以下公式: total = 0 for i in range(len(str(n))): a = int(str(n)[i]) b = int(str(n)[:i] or 0) c = int(str(n)[i+1:] or 0) total += b * 10**(len(str(n))-i-1) if a > x: total += 10**(len(str(n))-i-1) elif a == x: total += c + 1 其,b表示高位,c表示低位,total表示数字x在1到n出现数。 最后,我们可以调用以上代码来计算数字x在1到n出现数。 ### 回答3: 这道题目是一道数位分析的题目,经常被应用在计数问题的解决过程。我们首先需要分析题干的数据,题干给出的是一个区间[1, n],同时需要计算数字x在该区间出现数。 首先我们需要分析数字x所在的位置,数字x在每一个数位上均有可能出现,分别是个位上,十位上,百位上,千位上以及更高位上。因此,我们可以通过逐个数位去分析数字x的出现数,然后将所有可能出现的位置的数加起来即为数字x在区间[1, n]出现的总数。 我们以数字x为1为例,来分析数字1在每一个数位上出现数。首先是个位上,当个位上的数是1时,个位上数字1会出现1,当个位上的数比1小时,个位上数字1均不会出现,因此个位上数字1的出现数为n/10 + (n mod 10 >= 1 ? 1 : 0)。 接着分析十位上数字1的出现数,当十位上的数是1时,十位上数字1会在数值为10~19,110~119, 210~219, …… (n/100) * 10 + (n mod 100 >= 10 ? 10 : 0) + (n mod 100 - 10 + 1 > 0 ? n mod 100 - 10 + 1 : 0) 同理,因为数字1在每一个数位上均有可能出现,可以逐个数位分析,计算数字1在每个数位上出现数,然后将各个数位上数字1的出现数加起来即为数字1在区间[1, n]出现的总数。 类似地,计算其他数字区间[1, n]出现的总数同样可以采用这种方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值