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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

發布時間:2023/12/2 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

眾所周知,《劍指offer》是一本“好書”。

如果你是個算法菜雞(和我一樣),那么最推薦的是先把劍指offer的題目搞明白。

對于劍指offer題解這個系列,我的寫作思路是,對于看過文章的讀者,能夠做到:

  • 迅速了解該題常見解答思路(偏門思路不包括在內,節省大家時間,實在有研究需求的人可以查閱其它資料)
  • 思路盡量貼近原書(例如書中提到的面試官經常會要求不改變原數組,或者有空間限制等,盡量體現在代碼中,保證讀者可以不漏掉書中細節)
  • 盡量精簡話語,避免冗長解釋
  • 給出代碼可運行,注釋齊全,關注細節問題
  • 代碼能夠通過牛客網在線編程《劍指offer》測試

《劍指offer題解》系列

你可以通過以下兩種途徑查看《劍指offer題解》系列:

  • 關注我的公眾號:Rude3Knife,點擊公眾號下方:劍指offer題解
  • 劍指offer題解專欄(CSDN)

題目介紹

求出1 ~ 13的整數中1出現的次數,并算出100 ~ 1300的整數中1出現的次數?為此他特別數了一下1 ~ 13中包含1的數字有1、10、11、12、13因此共出現6次,但是對于后面問題他就沒轍了。ACMer希望你們幫幫他,并把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

解題思路

方法一:遞歸每個數字

思路

思路很簡單,寫個for循環,從1到n,在循環體中判斷這個數包含了多少個1

復雜度O(nlogn),面試官不怎么開心呢。。

方法二:找規律

思路

思路解釋參考:

https://www.nowcoder.com/profile/3371548/codeBookDetail?submissionId=16319486

設N = abcde,其中abcde分別為十進制中各位上的數字。
如果要計算百位上1出現的次數,它要受到3方面的影響:百位上的數字,百位以下(低位)的數字,百位以上(高位)的數字。①如果百位上數字為0,百位上可能出現1的次數由更高位決定。比如:12013,則可以知道百位出現1的情況可能是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,,…,11100 ~ 11199,一共1200個。可以看出是由更高位數字(12)決定,并且等于更高位數字(12)乘以 當前位數(100)。② 如果百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響。比如:12113,則可以知道百位受高位影響出現的情況是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,,….,11100 ~ 11199,一共1200個。和上面情況一樣,并且等于更高位數字(12)乘以當前位數(100)。但同時它還受低位影響,百位出現1的情況是:12100~12113,一共114個,等于低位數字(113)+1。③ 如果百位上數字大于1(2 ~ 9),則百位上出現1的情況僅由更高位決定,比如12213,則百位出現1的情況是:100 ~ 199,1100 ~ 1199,2100 ~ 2199,…,11100 ~ 11199,12100 ~ 12199,一共有1300個,并且等于更高位數字+1(12+1)乘以當前位數(100)。

代碼

public int NumberOf1Between1AndN_Solution(int n) {//1的個數int count = 0;//當前位int i = 1;int current, after, before;while((n/i)!= 0){//高位數字current = (n/i)%10;//當前位數字before = n/(i*10);//低位數字after = n-(n/i)*i;//如果為0,出現1的次數由高位決定,數量等于高位數字 * 當前位數if (current == 0) {count += before * i;} else if(current == 1) {//如果為1,出現1的次數由高位和低位決定,高位*當前位+低位+1count += before * i + after + 1;} else{//如果大于1,出現1的次數由高位決定,(高位數字+1)* 當前位數count += (before + 1) * i;}//前移一位i = i*10;}return count; }

總結

此題思考再三,想分析作者為什么要出此題,該題出現在優化時間和空間效率大類中,作者主要是想讓同學們運用邏輯推理,想到時間上更優化的解法。

《劍指offer題解》系列

你可以通過以下兩種途徑查看《劍指offer題解》系列:

  • 關注我的公眾號:Rude3Knife,點擊公眾號下方:劍指offer題解專欄
  • 劍指offer題解專欄(CSDN)

關注我

我是一名后端開發。主要關注后端開發,數據安全,爬蟲等方向。微信:yangzd1102

Github:@qqxx6661

個人博客:

  • CSDN:@qqxx6661
  • 知乎:@Zhendong
  • 簡書:@蠻三刀把刀
  • 掘金:@蠻三刀把刀

原創博客主要內容

  • Java知識點復習全手冊
  • Leetcode算法題解析
  • 劍指offer算法題解析
  • SpringCloud菜鳥入門實戰系列
  • SpringBoot菜鳥入門實戰系列
  • Python爬蟲相關技術文章
  • 后端開發相關技術文章

個人公眾號:Rude3Knife

如果文章對你有幫助,不妨收藏起來并轉發給您的朋友們~

總結

以上是生活随笔為你收集整理的java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数的全部內容,希望文章能夠幫你解決所遇到的問題。

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