2021-07-19:给定一个正数N,比如N = 13,在纸上把所有数都列出来如下: 1 2 3 4 5 6 7 8 9 10 11 12 13,可以数出1这个字符出现了6次,给定一个正数N,如果把1

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-07-19:给定一个正数N,比如N = 13,在纸上把所有数都列出来如下: 1 2 3 4 5 6 7 8 9 10 11 12 13,可以数出1这个字符出现了6次,给定一个正数N,如果把1相关的知识,希望对你有一定的参考价值。

2021-07-19:给定一个正数N,比如N = 13,在纸上把所有数都列出来如下: 1 2 3 4 5 6 7 8 9 10 11 12 13,可以数出1这个字符出现了6次,给定一个正数N,如果把1~N都列出来,返回1这个字符出现的多少次。

福大大 答案2021-07-19:

1.最高位是1的情况。
1364:365~1364,千位上是365个1,百位上有100个1,十位上有100个1,个位上有100个1。
2.最高位不是1的情况。
5364:365~5364,千位上是1000个1,百位上有500个1,十位上有500个1,个位上有500个1。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "math"
)

func main() {
    num := 21
    ret := solution2(num)
    fmt.Println(ret)
}

// 1 ~ num 这个范围上,画了几道1
func solution2(num int) int {
    if num < 1 {
        return 0
    }
    // num -> 13625
    // len = 5位数
    len2 := getLenOfNum(num)
    if len2 == 1 {
        return 1
    }
    // num  13625
    // tmp1 10000
    //
    // num  7872328738273
    // tmp1 1000000000000
    tmp1 := powerBaseOf10(len2 - 1)
    // num最高位 num / tmp1
    first := num / tmp1
    // 最高1 N % tmp1 + 1
    // 最高位first tmp1
    firstOneNum := twoSelectOne(first == 1, num%tmp1+1, tmp1)
    // 除去最高位之外,剩下1的数量
    // 最高位1 10(k-2次方) * (k-1) * 1
    // 最高位first 10(k-2次方) * (k-1) * first
    otherOneNum := first * (len2 - 1) * (tmp1 / 10)
    return firstOneNum + otherOneNum + solution2(num%tmp1)
}

func getLenOfNum(num int) int {
    len2 := 0
    for num != 0 {
        len2++
        num /= 10
    }
    return len2
}

func powerBaseOf10(base int) int {
    return int(math.Pow10(base))
}

func twoSelectOne(c bool, a int, b int) int {
    if c {
        return a
    } else {
        return b
    }
}

执行结果如下:
图片


左神java代码

以上是关于2021-07-19:给定一个正数N,比如N = 13,在纸上把所有数都列出来如下: 1 2 3 4 5 6 7 8 9 10 11 12 13,可以数出1这个字符出现了6次,给定一个正数N,如果把1的主要内容,如果未能解决你的问题,请参考以下文章

2022-10-03:给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它

2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i] = { a, b, c }表示,用户i报

第一个没有出现的正数

2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组matrix, matrix[j] = {a,

2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow