LeetCode第233題數字1的個數

2021-08-30 02:29:34 字數 1589 閱讀 3882

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。

示例:輸入: 13

輸出: 6

解釋: 數字 1 出現在以下數字中: 1, 10, 11, 12, 13 。

0.暴力破解法,依次遍歷每個數中的1的個數,累加起來(演算法題如果是挨個寫到這題的話,這個想法在腦中也就是一閃而過)

1.遞迴法:

為了方便操作做了一些前導操作:把乙個int拆分成vector,同時也寫了乙個vector轉回int的函式

對於vectornums 的i號元素(即原數的第i+1位)而言分為3種情況:

0)nums【i】==0;直接digui下一位;

1)nums【i】==1;比如說nums【i----nums.size()-1】所構成的數是185那麼他產生的1的總共個數有以下幾個部分

(185是3位數)所以第一部分(數字低於3位,,1位or2位)他至少包括2個數所構成的最大1的個數(其實就0-99之間1的個數和ps:這個是完全2位數構成的)第二部分(數字必須是3位數(100-185))我們會發現首位是1,至少包括185-100+1個(但是這只是第乙個位置上的1的個數,後面還有2位呢),所以再加上85所能得到1的個數(digui(85))

2)nums【i】>=2;

這裡拿485舉例:==第一部分(數字低於3位,,1位or2位)==這個和上面的情況一樣;第二部分(數字必須是3位數)

以1打頭;這時候情況跟上面不太一樣,因為我們可以達到199!!!,所以以1打頭的為(199-100+1)+digui(99),ps:digui(99)其實就是完全2位數構成的1個數記為m,即為:(199-100+1)+m;

以2,3打頭是可以達到,299,399的(所以和4不一樣)

他們每個都是完全2位構成1的個數即2個*m;

以4打頭的(400-485):這時候我們不能把他記為m(digui(99)),應該單算一下digui(85);

vectormakedigitvector(int &n);

while (n)

return m;

} int cangetmax(int size ,vector&m)

int x = cangetmax(size - 1,m);

total = pow(10, size - 1)+10*x;

m[size] = total;

return total;

} int vectortoint(vector&nums, int & begin)

int digui(vector&nums,int begin,vector&m)

if (nums[begin] == 0)return digui(nums, begin + 1, m);

else if (nums[begin] == 1)

else

} int countdigitone(int n)

vectornums=makedigitvector(n);

vectorm(nums.size()+1, 0);

cangetmax(nums.size() , m);

return digui(nums, 0, m);

}

LeetCode 233 數字1的個數

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。示例 輸入 13輸出 6解釋 數字 1 出現在以下數字中 1,10,11,12,13 假設我們要計算乙個六位數abcdef有多少個1,那麼我們要計算6個位置分別出現了多少次1,最後把6個位置的結果加和就是答案了。假如當前正在計...

LeetCode 233 數字 1 的個數

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。輸入 13 輸出 6 解釋 數字 1 出現在以下數字中 1,10,11,12,13 劍指offer 第43題,解法見書。從 數字規律 著手,通過具體的例子一步步找出規律。c 語言版 class solution intmyso...

233 數字1的個數

給定乙個整數 n,計算所有小於等於 n 的非負整數中數字 1 出現的個數。示例 輸入 13輸出 6解釋 數字 1 出現在以下數字中 1,10,11,12,13 最開始想到的是暴力,但是暴力應該是過不了的。即是 把每乙個數字的裡1的個數都算出來再加起來就是答案 後來我改進了一下,但是還是超出時間和空間...