日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指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/

總結

以上是生活随笔為你收集整理的[剑指offer]面试题第[43]题[Leetcode][第233题][JAVA][1~n整数中1出现的次数][找规律][递归]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。