[剑指offer]面试题第[43]题[Leetcode][第233题][JAVA][1~n整数中1出现的次数][找规律][递归]

【问题描述】[困难]

在这里插入图片描述

【解答思路】

1. 暴力 (超时)

逐个数统计’1’的数量
时间复杂度:O(N^2) 空间复杂度:O(1)

 public int countDigitOne(int n) {int count = 0;for(int i=1;i<=n;i++){int tmp = i;while(tmp>0){if(tmp%10==1){count++;}tmp/=10;}}return  count;}
2. 分类

思路一
在这里插入图片描述

如果n = 4560234
让我们统计一下千位有多少个 1
xyz 可以取 0 到 455, abc 可以取 0 到 999
4551000 to 4551999 (1000)
4541000 to 4541999 (1000)
4531000 to 4531999 (1000)

21000 to 21999 (1000)
11000 to 11999 (1000)
1000 to 1999 (1000)
总共就是 456 * 1000
如果 n = 4561234
xyz 可以取 0 到 455, abc 可以取 0 到 999
4551000 to 4551999 (1000)
4541000 to 4541999 (1000)
4531000 to 4531999 (1000)

1000 to 1999 (1000)
xyz 还可以取 456, abc 可以取 0 到 234
4561000 to 4561234 (234 + 1)
总共就是 456 * 1000 + 234 + 1
如果 n = 4563234
xyz 可以取 0 到 455, abc 可以取 0 到 999
4551000 to 4551999 (1000)
4541000 to 4541999 (1000)
4531000 to 4531999 (1000)

1000 to 1999 (1000)
xyz 还可以取 456, abc 可以取 0 到 999
4561000 to 4561999 (1000)
总共就是 456 * 1000 + 1000

public int countDigitOne(int n) {int count = 0;//依次考虑个位、十位、百位...是 1//k = 1000, 对应于上边举的例子for (int k = 1; k <= n; k *= 10) { // xyzdabcint abc = n % k;int xyzd = n / k;int d = xyzd % 10;int xyz = xyzd / 10;count += xyz * k;if (d > 1) {count += k;}if (d == 1) {count += abc + 1;}//如果不加这句的话,虽然 k 一直乘以 10,但由于溢出的问题//k 本来要大于 n 的时候,却小于了 n 会再次进入循环//此时代表最高位是 1 的情况也考虑完成了if(xyz == 0){break;}}return count;
}

思路二
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间复杂度:O(logN) 空间复杂度:O(1)
在这里插入图片描述
在这里插入图片描述

 public int countDigitOne(int n) {int digit = 1, res = 0;int high = n / 10, cur = n % 10, low = 0;while(high != 0 || cur != 0) {if(cur == 0) res += high * digit;else if(cur == 1) res += high * digit + low + 1;else res += (high + 1) * digit;low += cur * digit;cur = high % 10;high /= 10;digit *= 10;}return res;}
3. 递归

在这里插入图片描述

class Solution {public int countDigitOne(int n) {return f(n);}private int f(int n ) {if (n <= 0)return 0;String s = String.valueOf(n);int high = s.charAt(0) - '0';int pow = (int) Math.pow(10, s.length()-1);int last = n - high*pow;if (high == 1) {return f(pow-1) + last + 1 + f(last);} else {return pow + high*f(pow-1) + f(last);}}
}

【总结】

1.这道题属于数学的分类,需要找规律,没有一些通用的算法,完全靠分析能力,如果面试碰到很容易卡住。

看实例理解

2.细心分析 注意边界

参考链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/

参考链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/javadi-gui-by-xujunyi/
参考链接:https://leetcode-cn.com/problems/number-of-digit-one/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-50/

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

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

相关文章

56jsp登录案例

链接&#xff1a;https://pan.baidu.com/s/1W4UYInbsm17V9_2rFLNGFg 提取码&#xff1a;c5g5 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 login.jsp <% page language"java" import"java.util.*" contentType"text/html; chars…

matplotlib的颜色和控制条

为了方便记忆&#xff0c;收藏备用 一 linestyle - solid line style -- dashed line style -. dash-dot line style : dotted line style 二marker style . point marker , pixel marker o circle marker v triangle_down mark…

[Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]

【问题描述】[中等] 【解答思路】 1. 动态规划 动态规划流程 第 1 步&#xff1a;设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数。 第 2 步&#xff1a;状态转移方程 假设当前我们已经考虑完了前 i -1个字符了&#xff0c;对于前 i 个字符对应的最少未匹配数&#…

三序遍历相互求法

给中序前序求后序遍历 根据前序和中序求后序遍历序列 根据前序和中序的特性分析 1 首先从前序序列确定当前子树的根节点 2 然后可以根据根节点到中序序列中找到左右子树的个数 分析左右子树 3 如果左右子树数量大于零 相当于我们分别知道了左右子树在前序和中序的子序列 4 通…

cp link

在linux中复制link文件时&#xff0c;如果想复制link的目标文件而不是link的话&#xff0c;可以用cp -L转载于:https://www.cnblogs.com/lybinger/p/10572515.html

[Leetcode][第1392题][JAVA][最快乐前缀][KMP][字符串编码]

【问题描述】[困难] 【解答思路】 1. Rabin-Karp 字符串编码&#xff08;详见总结&#xff09; 关于为什么哈希值计算乘数为31&#xff0c;说法是&#xff0c;首先31是质数&#xff0c;其次编译器会将31*i 优化为 (i<<5)-i 时间复杂度&#xff1a;O(N^2) 空间复杂度&…

平面图转对偶图19_03_21校内训练 [Everfeel]

对于每个平面图&#xff0c;都有唯一一个对偶图与之对应。若G‘是平面图G的对偶图&#xff0c;则满足&#xff1a; G中每一条边的两个节点对应着G中有公共边的面&#xff0c;包括最外部无限大的面。 直观地讲&#xff0c;红色标出来的图就是蓝色标出的图的对偶图。 求出一个平面…

pat 1085 Perfect Sequence (25) 二分查找

题意 给我们一个数串 让我们从中挑选数字 构成一个集合 使得集合中最小元素m和最大元素M 满足 m*p>M 求出集合的最大数量 分析 看下条件就可以发现 m*p >M 也就是在数串中找m*p>x x的上界 那么排下序二分找即可 code #include<bits/stdc.h> using nam…

58如何调出eclipse左边文件栏

如何让windows的左侧显示 点击windows --show view--project explore 像eclipse底部的一些信息展示不见了&#xff0c;比如代码输出结果展示的 console 等都可以通过 ShowView 找到并显示出来哦&#xff0c;如果没有就去 Window -> ShowView -> other去找吧

[JAVA][算法] [字符串匹配]KMP

我们为什么需要KMP&#xff1f; 在字符串匹配问题中&#xff0c;我们需要找到匹配串pattern在原串text中的位置&#xff0c;一种显而易见的思路就是暴力匹配&#xff0c;如图所示&#xff0c;我们把pattern放置到text中的每个位置进行比较即可。 但是大家可以发现&#xff0c;…

微信小程序入门与实战

第1章 什么是微信小程序&#xff1f; 介绍小程序的特点与适用场景、对开发者的影响以及课程特色&#xff01;七月老师小程序进阶课《纯正商业应用——微信小程序实战》与《微信小程序商城构建全栈应用》已上线&#xff0c;全面进阶小程序&#xff01; 1-1 序&#xff1a;十几个…

pat-1136. A Delayed Palindrome (20) 模拟

本可以java大数就能搞定的问题 当时用java写完答案明明对了提交总是答案错误 很是无语 题意 任给我们一个数 让我们对这个数进行翻转相加 如果加和是个回文数 就找到了程序出口 如果不是继续迭代 输出过程 如果迭代10次没有找到就输出特定信息 分析 就是模拟高精度加…

[Leetcode][第309题][JAVA][最佳买卖股票时机含冷冻期][动态规划][压缩空间]

【问题描述】[中等] 【解答思路】 1. 动态规划 动态规划流程 第 1 步&#xff1a;设计状态 f[i]表示第 i 天结束之后的「累计最大收益」 第 2 步&#xff1a;状态转移方程 f[i][0]max(f[i−1][0],f[i−1][2]−prices[i]) f[i][1]f[i−1][0]prices[i] f[i][2]max(f[i−1][1]…

59 javabean的创建

在一个项目里定义一个java类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String g…

IIS Express 无法启动

IIS Express 无法启动1. \.vs\config\applicationhost.config2. 打开.csproject 中把 <UseIIS> 改成 False ----------------------------------------------------------------------------------------------- 我上传的项目代码被同事下载之后使用iisexpress调试一直报…

[剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]

【问题描述】[简单] 【解答思路】 1. 暴力 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) public class Solution {public int maxProfit(int prices[]) {int maxprofit 0;for (int i 0; i < prices.length - 1; i) {for (int j i 1; j < prices.leng…

60usebean创建实例对象

建立一个users的java类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPas…

ROS学习笔记四:用C++编写ROS发布与订阅

一、创建并编译功能包 1.1 创建功能包 在工作空间的 src 目录下创建功能包&#xff1a; $ cd ~/dev/catkin_ws/src $ catkin_create_pkg chapter2_tutorials std_msgs roscpp 1.2 编译功能包 进入工作目录下编译全部功能包&#xff1a; $ cd ~/dev/catkin_ws/ $ catkin_make 如…

Levko and Permutation CodeForces - 361B 思维 数论

题意 对一个长度&#xff0c;最大值为n的排列 构造出其恰好有k个GCD(i,a[i])>1 的排列 n<1e5;分析 由于每个大于1的数与自己的gcd必然>1 所以构造大于1的gcd可以用i与i去构造 那么还有就是相邻的两个数的gcd必然等于1 任何数与1的gcd都等于1 所以让k个数 从2开始…