[剑指offer]面试题第[43]题[Leetcode][第233题][JAVA][1~n整数中1出现的次数][找规律][递归]
【問題描述】[困難]
【解答思路】
1. 暴力 (超時)
逐個數統計’1’的數量
時間復雜度:O(N^2) 空間復雜度:O(1)
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
思路二
時間復雜度:O(logN) 空間復雜度:O(1)
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/
總結
以上是生活随笔為你收集整理的[剑指offer]面试题第[43]题[Leetcode][第233题][JAVA][1~n整数中1出现的次数][找规律][递归]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB作图颜色
- 下一篇: 【解决问题】useBean类属性[com