NowCoder

解题思路

思路是分别计算个位、十位、百位…上出现 1 的个数。
以 n =216为例:
个位上: 1 ,11,21,31,…211。个位上共出现(216/10)+ 1个 1 。因为除法取整,210~216间个位上的1取不到,所以我们加8进位。你可能说为什么不加9,n=211怎么办,这里把最后取到的个位数为1的单独考虑,先往下看。
十位上:1019,110119,210~216. 十位上可看成 求(216/10)=21 个位上的1的个数然后乘10。这里再次把最后取到的十位数为1的单独拿出来,即210~216要单独考虑 ,个数为(216%10)+1 .这里加8就避免了判断的过程。
后面以此类推。
时间复杂度 O(logN)

public class Solution {public int NumberOf1Between1AndN_Solution(int n) {int cnt = 0;for (int m = 1; m <= n; m *= 10) {int a = n / m, b = n % m;//cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);cnt += ( a/10 +(a%10>1 ?1:0) )* m + (a % 10 == 1 ? b + 1 : 0);}return cnt;}
}


public class Solution {public int NumberOf1Between1AndN_Solution(int n) {int res = 0, m = 1;int high = n / 10, cur = n % 10, low = 0;while(high != 0 || cur != 0) {if(cur == 0) res += high * m;else if(cur == 1) res += high * m + low + 1;else res += (high + 1) * m;low += cur * m;cur = high % 10;high /= 10; m *= 10;}return res;}
}

【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数相关推荐

  1. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  2. 【LeetCode】剑指 Offer 43. 1~n 整数中 1 出现的次数

    [LeetCode]剑指 Offer 43. 1-n 整数中 1 出现的次数 文章目录 [LeetCode]剑指 Offer 43. 1-n 整数中 1 出现的次数 package offer;pub ...

  3. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  4. 【LeetCode】剑指 Offer 67. 把字符串转换成整数

    [LeetCode]剑指 Offer 67. 把字符串转换成整数 文章目录 [LeetCode]剑指 Offer 67. 把字符串转换成整数 package offer;public class So ...

  5. 剑指offer——面试题57:删除链表中重复的结点

    剑指offer--面试题57:删除链表中重复的结点 Solution1: 删两遍,自己想的破算法.理论上时间复杂度也是O(n)O(n)O(n),并非最优解. /* struct ListNode {i ...

  6. 剑指offer——面试题55:字符流中第一个不重复的字符

    剑指offer--面试题55:字符流中第一个不重复的字符 Solution1: 当年第一次做这个题的做法 对此题最大的感想是: 1)区分deque(双端队列)和queue(队列): 2)要熟悉queu ...

  7. Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】

    目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...

  8. 剑指 Offer 22(链表4).链表中的倒数第k个结点

    剑指 Offer 22(链表4).链表中的倒数第k个结点 问题描述: 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链 ...

  9. [[EVD]] - 剑指 Offer 67. 把字符串转换成整数

    题目分析:[[EVD]] - 剑指 Offer 67. 把字符串转换成整数https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-chen ...

  10. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

最新文章

  1. 8、web入门回顾/ Http
  2. Sring AOP(简记)
  3. 下载Centos7 64位镜像
  4. 经典面试题(9):以下代码将输出什么?并解释你的答案。
  5. MacOSX系统怎么开启Root账户?Mac电脑开启root权限教程
  6. 【Linux】Linux测试磁盘 IO 性能
  7. forEach for 循环
  8. android 3d布局轮播,android 图片/视频混合轮播控件banner
  9. 利用Python进行数据分析笔记-时间序列(时区、周期、频率)
  10. 学习webpack系列之四 ---- (学习开发环境)
  11. 这10道经典软件测试题,不会的话真会丢了工作!
  12. 防御性编程:足够偏执
  13. 数字电子技术-数字逻辑概论
  14. u8、u16、u32、s8、s16、s32、Size_t是什么类型?
  15. 安卓的数据共享——从一个APP中调用另一个APP数据的方法
  16. 单核CPU如何执行多线程
  17. 拥有火绒后关闭Windows防火墙
  18. 用“心”迎接情人节,用另一种形式表达爱意
  19. Linux 用ssh远程登录及scp传输文件
  20. Linux 性能分析工具- Atop安装和使用

热门文章

  1. uboot中bss的理解
  2. c语言出现源文件未编译,dev运行C语言出问题
  3. 信息收集(OSINT)解释与实践-初
  4. 使用Raspberry Pi搭建迅雷离线下载机
  5. Java小白-9.Java多线程
  6. python爬取王者荣耀所有皮肤
  7. 福大软工 · 第七次作业 - 需求分析报告
  8. 或操作(||)和与操作()的执行顺序以及返回结果
  9. html thead作用,html元素thead标签的使用方法及作用
  10. 解决AssertionError Torch not compiled with CUDA enabled问题