#12296. 奇葩楼层

奇葩楼层

奇葩楼层(C语言二级 · 编程题)

时间限制: 5000 ms 内存限制: 65535 KB 分值: 20 分(建议)

问题描述:

几乎每个国家都有自己忌讳的数字,有的大楼在给楼层编号的时候,会刻意跳过含有不吉利数字的编号。比如中国人比较忌讳数字 4,有的大楼就没有第 4 层、第 14 层等等,这样楼层的编号就会是 1235、…… 即编号为 5 的楼层实际是第 4 层。那么在去掉了忌讳数字之后,最高楼层编号为 n 的大楼,实际上有多少层呢?

输入:

输入在一行中给出 2 个整数,依次为大楼最高层的编号 n1 < n ≤ 1000),和某国人民忌讳的数字 d0 ≤ d ≤ 9)。题目保证 n 中不包含 d

输出:

在一行中输出该大楼的实际楼层数。

样例输入:

50 4

样例输出:

36

解题思路:

  1. 输入​:
    • n 表示楼层编号的最大值。
    • d 是忌讳数字,这个数字出现在楼层编号中时,应该跳过。
  2. 核心问题​:
    • 我们需要找出楼层编号中不包含忌讳数字 d 的实际楼层数。
  3. 解决步骤​:
    • 遍历从 1 到 n 的每个楼层编号,检查该编号是否包含忌讳数字 d
    • 如果不包含,计数加一。
  4. 输出​:
    • 输出不包含忌讳数字的楼层数量。

时间复杂度:

  • 每个字符串最多检查一次相邻字符,最坏情况下需要对每个楼层进行字符串操作。每个字符串最多有 log10(n) 位,因此时间复杂度为 O(n * log10(n))

空间复杂度:

  • 空间复杂度为 O(1),只需要常数空间来存储变量。

样例输入:

50 4

样例输出:

36

解释:

  • 楼层编号从 1 到 50,但忌讳数字是 4。因此,我们需要排除包含 4 的楼层编号,如 4、14、24、34、44。
  • 剩下的楼层编号为:1、2、3、5、6、7、8、9、10、11、12、13、15、16、17、18、19、20、21、22、23、25、26、27、28、29、30、31、32、33、35、36、37、38、39、40、41、42、43、45、46、47、48、49、50。
  • 共有 36 层楼符合条件。