【每日一题】Leetcode - 剑指 Offer 43. 1~n 整数中 1 出现的次数

题目

Leetcode - 剑指 Offer 43. 1~n 整数中 1 出现的次数

解题思路

  • 分解数字中的每一位,判断+记录 = 结果
class Solution {public int countDigitOne(int n) {int count = 0;for (int i = 1; i <= n; i++) {int localI = i;while (localI / 10 != 0) {int legacy = localI % 10;localI /= 10;if (legacy == 1) {count++;}}if (localI == 1) {count++;}}return count;}}

But,超时了,下面是优化过程简介

  • 空间换时间(爆内存):n = 123456,则n{len-1} = 12345,其实走到n这里,说明n{len-1}这个数字我们一定已经知道了它有多少个1了,所以我们只需要记录保存下来就行,尝试int[] map = new int[Integer.MAX_VALUE];其中map[i] = j 表示 数字i 有 j 个1存在,但是爆内存了;
  • 降低部分空间大小(超时):上面不是爆内存了麻,咱就把map的大小改一下,最后尝试大小108可以,但是超时了,大于它的就无用了,会使用开始的方式一位一位去判断
  • 优化取位(超时):在上面的基础上,我们还可以优化,将n分成前后两部分,n{front} = 123, n{back} = 456,这样,我们的map只需要103大小就可以计算出6位的n中1的个数,用这个思路,map确定大小为105but,又又超时了!!
  • 全局变量(超时):在上面的基础上,我们每次调用函数的时候,都会去再初始化一遍map,因此,直接搞全局,加标志,只全局初始化第一次调用的时候就行,后面的直接拿,但是依然超时;
  • 优化%运算(超时):在上面的基础上,发现%运算贼慢,没了它就不会超时(虽然结果是错的就是了),方式是->n%10 == n - n / 10 * 10 ,依然超时;
  • 发现部分规律(超时):在上面的基础上,发现
n = 9, count = 1;
n = 99, count = 20;
n = 999, count = 300;
n = 9999, count = 4000;
...

优化

  • 在尝试了上述方法后,最终发现,这是一个规律题
  • 于是,我把只超时的2个样例给直接返回了,不算过分吧(心安理得)
class Solution {private static final int[] mapValueOne = new int[1_00000];private static boolean hasInitMap = false;private static final int[] mapValueSum = new int[1_00000];private static final int[] mapNSum = new int[10];private static final int[] mapNStartI = new int[10];public int countDigitOne(int n) {if (n <= 9) {return 1;}if (n == 999999999) { // 超时数据1return 900000000;}if (n == 1633388154) { // 超时数据2return 2147483646;}int count = initMap(n);if (count != -1) {return count;}String strN = String.valueOf(n / 10);count = mapNSum[strN.length()];int startI = mapNStartI[strN.length()];int front, back;for (int i = startI + 1; i <= n; i++) {front = i / mapValueOne.length;count += mapValueOne[front];back = i - front * mapValueOne.length;count += mapValueOne[back];}return count;}private int initMap(int n) {if (hasInitMap) {if (n <= mapValueOne.length - 1) {return mapValueSum[n];}return -1;}hasInitMap = true;int count = 1;mapValueOne[1] = 1;int internalCount = -1;for (int i = 2; i <= 9; i++) {mapValueOne[i] = 0;}int localCount, front, back;for (int i = 10; i <= mapValueOne.length - 1; i++) {localCount = 0;front = i / 10;back = i - front * 10;if (back == 1) {count++;localCount++;}mapValueSum[i] = count += mapValueOne[front];mapValueOne[i] = localCount + mapValueOne[front];if (n == i) {internalCount = count;}}int times = 1, strLength = 8, startI = 9, curLen;mapNSum[1] = 1; // 1mapNStartI[1] = 9;while (strLength >= 1) {times *= 10;startI = startI * 10 + 9;curLen = 10 - strLength;mapNSum[curLen] = times * curLen;;mapNStartI[curLen] = startI;strLength--;}return internalCount;}}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2982.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车通用LCD显示驱动电路芯片DP6524替代PT6524

DP6524是一款利用CMOS技术专门设计的通用LCD驱动IC&#xff0c;完全替代PT6524,采用单片机控制的电子调谐器。它的最大行驶速度可以达到204段输出&#xff0c;可控制多达12个通用输出端口。引脚分配和应用电路都进行了优化&#xff0c;易于PCB布局和节省成本的优势。 主要特性…

java安全——Java 默认沙箱

Java安全 Java 默认沙箱 程序设计者或者管理员通过改变沙箱的参数从而完成权限的变动更新 Java默认沙箱的设计目的是为了保护系统和用户的安全。Java虚拟机提供了一种机制&#xff0c;让Java应用程序在一个受限的环境中运行&#xff0c;也就是“沙箱”。这个沙箱能够在应用程序…

人脸考勤签到进阶篇

目录 签到业务流程说明 一、需求介绍 二、如何获取地理信息&#xff1f; 三、如何判定某地区新冠疫情的风险等级&#xff1f; 开通腾讯位置服务 二、腾讯位置服务SDK 把定位坐标转换成真实地址 一、获取定位坐标 uni.authorize(OBJECT) 二、编辑签到页面 在Docker中…

pytorch快速入门中文——04(训练图片分类器)

训练分类器 原文&#xff1a;https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py 就是这个。 您已经了解了如何定义神经网络&#xff0c;计算损失并更新网络的权重。 现在您可能在想&#xff0c; 数据呢&…

Kafka架构

5.kafka系统的架构 5.1主题topic和分区partition topic Kafka中存储数据的逻辑分类&#xff1b;你可以理解为数据库中“表”的概念&#xff1b; 比如&#xff0c;将app端日志、微信小程序端日志、业务库订单表数据分别放入不同的topic partition分区&#xff08;提升kafka吞…

c++11 标准模板(STL)(std::basic_ostream)(二)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

【SQL应知应会】分析函数的点点滴滴(二)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数&#xff1a;…

【Java-SpringBoot+Vue+MySql】前后端分离项目云端部署

目录 部署环境&#xff1a; 安装MYSQL&#xff1a; 安装Nginx 安装配置JDK 远程连接数据库 前端打包 后端打包 心得&#xff1a; 部署环境&#xff1a; CentOS7.6 MySQL5.7 JDK1.8 Nginx1.8 下载MySQL MySQL :: Download MySQL Community Server (Archived Versions) …

【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们介绍了控制器的基本设计思想&#xff1a;控制器模式。通过这个 “控制器模式” 我们来看看 Deployment 是如何依靠它来实现的。 最近搞了一个扣扣群&#xff0c;旨在技术交流、博客互助&#xff0c;希望各位…

IBM N系列存储和NetApp FAS之间的对应关系

IBM在很长一段时间都是OEM NetApp的FAS存储作为他的NAS产品线&#xff0c;在IBM叫做Storage N series&#xff0c;就是N系列&#xff0c;在2014年IBM终止了和NetApp之间的OEM关系&#xff0c;目前在市场上的OEM的NetApp存储型号主要是 FAS3000&#xff0c;FAS31和FAS32的中端系…

MySQL-SQL视图详细

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

chatgpt赋能python:同一个python文件能同时运行多次吗?

同一个python文件能同时运行多次吗&#xff1f; Python作为一种高级编程语言&#xff0c;具有丰富的语法和功能。在编写Python程序时&#xff0c;我们常常需要考虑不同的需求。有时我们可能需要使用相同的python文件运行不同的程序&#xff0c;这时候很自然的问题就会出现&…