当前位置: 首页 > news >正文

整数中1出现的次数(从1到n整数中1出现的次数)

 解题思路1:

        设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),分别对每个数位上有多少包含1的点进行分析。

第一步:对n进行分割,分为两部分:高位n/i(即a),低位n%i(即b)

第二步:分三种情况进行讨论:

1)当i表示百位,且百位对应的数>=2时,如n=31456,i=100,则a=314,b=56,其中百位对应的数字是4,4>=2。此时百位为1的次数有a/10+1=32(最高两位0~31),每一次都包含100个连续的点,即共有(a/10+1)*100个点的百位为1的数字。

 2)当i表示百位,且百位对应的数为1时,如n=31156,i=100,则a=311,b=56,其中百位对应的数字是1。此时百位对应的就是1,则共有a/10(最高两位0-30)次是包含100个连续点。当最高两位为31(即a=311),本次只对应局部点00~56,共b+1次。即共有(a/10*100)+(b+1)个。

  3)当i表示百位,且百位对应的数为0,如n=31056,i=100,则a=310,b=56,其中百位对应的数字是0。此时百位为1的次数有a/10=31(最高两位0~30)。

         综合以上三种情况,当百位对应0或>=2时,有(a+8)/10次包含所有100个点,还有当百位为1(即a%10==1),需要增加局部点b+1。之所以补8,是因为当百位为0,则a/10==(a+8)/10,当百位>=2,补8会产生进位位,效果等同于(a/10+1)。

import java.util.*;
public class Solution {public int NumberOf1Between1AndN_Solution(int n) {int count = 0;for(int i = 1; i <= n; i*=10){int a = n/i,b = n%i;count += (a + 8)/10*i + ((a%10 == 1) ? 1: 0)*(b + 1);}return count;}
}

http://www.lryc.cn/news/119017.html

相关文章:

  • Vue2:路由
  • 【Docker】Docker的应用场景,Docker 的优点,Ubuntu Docker 安装,使用 Shell 脚本进行安装
  • CentOS7 启动谷歌浏览器 java+Selenium+chrome+chromedriver
  • 【无公网IP】在公网环境下Windows远程桌面Ubuntu 18.04
  • Java“牵手拼多多商品详情数据采集方法,拼多多API接口申请指南
  • Leetcode-每日一题【剑指 Offer 15. 二进制中1的个数】
  • docker 怎么搭建
  • Signal Desktop for Mac(专业加密通讯软件)中文版安装教程
  • 【博客686】k8s informer list-watch机制中的re-list与resync
  • 【Spring专题】Spring底层核心原理解析
  • 出于网络安全考虑,印度启用本土操作系统”玛雅“取代Windows
  • tensotflow中tf.title()和tf.broadcast()
  • 想要延长Macbook寿命?这六个保养技巧你必须get!
  • mysql基础之触发器的简单使用
  • Spring Boot 配置多数据源【最简单的方式】
  • 1、Java简介+DOS命令+编译运行+一个简单的Java程序
  • Linux 文件与目录管理,Linux 文件内容查看
  • Mysql按小时进行分组统计数据
  • springboot3日志配置
  • 7款轻量级平面图设计软件推荐
  • SpringCloud实用篇5——elasticsearch基础
  • SpringCloud整体架构概览
  • (el-switch)操作(不使用 ts):Element-plus 中 Switch 将默认值修改为 “true“ 与 “false“(字符串)来控制开关
  • AI绘画网站都有哪些比较好用?
  • Android应用开发(35)SufaceView基本用法
  • 原生JS手写扫雷小游戏
  • 网络安全进阶学习第十五课——Oracle SQL注入
  • 线程池死循环系统卡住
  • 多用户微商城多端智慧生态电商系统搭建
  • 基于Kubeadm部署k8s集群:下篇