安全性(31)を証明するために提供ペナルティ:1つの整数が表示されます(発生回数をnが1から1の整数です)

安全性(31)を証明するために提供ペナルティ:1つの整数が表示されます(発生回数をnが1から1の整数です)

検索マイクロチャネル公共番号:「AI-ming3526」以上のアルゴリズム、機械学習のための「この小さなコンピュータビジョン」、ドライ
CSDN:https://blog.csdn.net/baidu_31657889/
GitHubの:https://github.com/あいみ-CN / AILearners

まず、プライマー

このシリーズは、独自のアルゴリズムの下で能力を強化することを目指して、オンラインの質問ノートの牛をはねのける「安全オファーを証明するために、」私のブラシです。
:解決オファーCSDNとgithubのリンクをクリックして、安全性の問題を証明するために、完全なアルゴリズムを見る
安全オファーを証明する完全な分析演習CSDNアドレス
githubのアドレス

第二に、タイトル

13 1〜1の整数の数が生じ算出、及び回数出現1300内1~1の整数を計算?彼は特に約1〜13まで数えて、この目的を達成するために1は1,10,11,12,13が5回表示されますので、あっている数字が含まれていますが、彼Meizhe後ろの問題のために。ACMerは、あなたが彼を助けることを願っていますし、問題がより一般化され、範囲1が表示され、非負の整数の数(1からnまでの発生回数。1)は、すぐに任意のを見つけることができます。

1、アイデア

方法1:nは、それぞれ、数で決定された1の各整数〜のために、最も直感的には、nは、特に、「安全性を証明するために提供」を参照してください。この方法の時間計算量はO(N * logN個)、Nが大きい場合、一般的なタイムアウトです。

方法2:直感的に解決しない場合は問題のこのカテゴリには、その後、通常は数学の問題に転換法を見つけるために実施します。この質問は、「プログラミングの美」であり、より詳細な説明、特定の分析と併せて、以下の例があります。

分析の前に、我々は最初のルールを知っておく必要があります。

  • 1-10からは、その一桁で、番号1が1回表示されます。
  • 1から100まで、彼らの10桁で、デジタル1が10回表示されます。
  • 1-1000からは、彼らの数百の位で、数1は100回表示されます。
    回-というように、1から10Iに、その右から2番目の場所で、数1は、10 ^(1 i)が表示されます。

以下のためのN = 2134 1 1 2134 2134までのすべての数がこの数を見つけること。当社は、2134年のビット単位の分析もできます。

(1)1から2130ビットで、10 213を含んでいる、213そう数1ワードを含む数字のみ2131,2132,2133,2134 2131樹脂の残数が、左、2回出現します下は含まれません。したがって、番号1の桁数の合計は、213 + 1 = 214です。

(2)1から2100 10において、21 100を含んでいる、デジタル1が唯一の10桁となる〜2119〜2134 2110 2101から21×10 = 210回、残りの10個の数字を表示しますデジタルビットは、10 1の桁数の合計は、210 + 10 = 220であり、1です。

(3)百で、1から2000、それは、2つの1000に含まれ、1ディジタル35にのみ番号2100から2134まで2 * 100 = 200、2001から2134までの残数を、表示され百数は1、1 + 35 = 235〜200百桁の数字の合計数です。

(4)千に、それは0 10000含まれているため、数1 1000 * 0 = 0、そう1000 1999、唯一1000の数字が1である数の千数残り、千に登場しました1ビットの総数に関する数値は1000です。

したがって、n個の数で2134から1から、出現数の総数は、1669 = 214 + 220 + 235 + 1000です。

上記の手順がまとめた何を、あなたは、このようなルールを取得することができます:

数nに対して、その算出最初のI(I右から数えて1つの開始からの)ビット数の桁数を含みます。

次に、xのi番目のビットでなされた仮定

上位桁ビットがビットの最大数にI + 1のままである1 X> 1、次いで数1が上位桁:( + 1のi番目の桁に含まれている場合)* 10 ^(I-1)( )数字からなります

2. X <1の場合は、数1を上位桁:(のi番目の桁に含まれている)* 10 ^(I-1)

3.もしx == 1は、i番目:( 1を含むビットの数がより高い数字である)* 10 ^(I-1)+(下位桁1)(式ときIから下位桁 - 1番号の最初の桁までの数字)

2、プログラミング

パイソン

コードの実装:

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1Between1AndN_Solution(self, n):
        # write code here
        if n < 1:
            return 0
        # mult位数 sumTime出现1的次数和
        mult, sumTimes = 1, 0
        while n//mult:
            div, mod = divmod(n, mult*10)
            curNum, curMod = divmod(mod, mult)
            if curNum > 1:
                sumTimes += div*mult + mult
            elif curNum == 1:
                sumTimes += div*mult + curMod + 1
            else:
                sumTimes += div*mult
            mult = mult*10
        return sumTimes

AIの詳細については、AIMI-CN AI学習交換基[1015286623]

技術、生活の中で楽しく共有:公共の私達の数コンピュータビジョンこの小さな週プッシュ「AI」シリーズのニュース記事を、あなたの関心を歓迎します!

おすすめ

転載: www.cnblogs.com/aimi-cn/p/11510770.html