n個の出現回数は1から131までの整数です。

タイトル説明

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

アイデア解析

それをしなかった、真実を教えてください。リファレンスを読んだ後、法律を知っています。

まず、数1
、米国の法律のプログラミングに与えられました:

  1. 0であれば(右から左へ、1つの参照始まる)は、i番目のビット数、私は(高いが0であるように、そうでない場合は高い)より高いビット決定によって起こる1の可能な数のビット、より高い桁Xに等しいです現在の中央値は体重10 ^(I-1)。
  2. i番目のビットの数字が1である場合、それは(下位ビット0に応じて、そうでない場合より低い)より高い衝撃によってだけでなく、低い衝撃によってのみならず、i番目のビット位置の数に表示されることがあり、現在のXの上位桁ビットに等しいです重量10(I-1)+(下位桁+ 1)^。
  3. ビット上の番号iが1より大きい場合、番号1は、ビットIビットに表示されることがあり(高いが0であるように、そうでない場合は高い)より高いことによってのみ決定され、(より高い桁+1)X現在のメジアン重量に等しいです10 ^(I-1)。

第二に、Xの数
ここでX∈[1,9]、X = 0は、次のルールのニーズに適合しないためには、別々に計算されます。
私たちは、最初に次のルールを知っている必要があります:
1-10から、その一桁で、Xのいずれかが一度浮上しています。
その数十で、1-100から、任意のX-登場10回。
1-1000からは、彼らの数百の位で、Xのいずれかが100回登場しました。
そのため1から10Iに、上に、第2のビット(右からiビット)は、任意のX 10 ^(I-1)回を受けた、その数に残さ。

一例として、N = 2593、X = 5。1から2593年に、数5が0で百、千倍のビット259倍、10で260回、294回など、813時間の合計が表示されます。

  1. まず、ビット。1から2590まで、それは10 259が含まれているので、任意の259 Xが出現しています。最後に残った3つの数字2591年、2592年と2593年、なぜなら彼らの最大桁3 <X、それは任意の5が含まれません。(したがって、3 <X、倍のXの数は、その後、唯一の可能なビット位置がより高いことによって決定され、また参照、上位桁(259)X101-1 = 259に等しいです)。
  2. その後、10。1から2500は、25 100を含み、従って任意のX 25×10 = 250回出現しています。残りの数字は、このように、すべての10 5を含む、2501から2593に10桁9> Xのその最大値です。最後に、250 + 10 = 260の合計。(そうでも参照、9> Xは、わずか10ビットがより高いことによって決定に起こり得るXの数は、上位桁= 260(25 + 1)X102-1に等しいです)。
  3. 百続きます。1から2000年まで、それはこのように任意のX 2×100 = 200回出現してきた、2〜1000が含まれています。残りの図は、2001年から2593年からある彼らの最大の百デジタル5 == X、その後、状況は少し複雑になり、彼らは百5に含まれなければならないが、100のすべてが含まれていません。百桁5を2500〜2593に、表示されている場合、110桁に関連付けられた桁数は、93 + 1 = 94です。最後に、200 + 94 = 294の合計。(あなたは5 == X、それはより高い100倍に表示されることがあり、それを見ることができないだけでなく、Xビットの影響によってだけでなく、低衝撃で、上位桁に等しい(2)X103-1 +(93 + 1)= 294) 。
  4. 最後に、千。今は高い位置は、それがどんな5は含まれませんので、このように直接、最大千図2 <Xを参照して、そこにあります。(したがって、2 <Xは、唯一千ビットに発生する可能性がありXの数がより高いことによって決定され、また参照、上位桁(0)X104-1 = 0に等しいです)。
    これまでのところ、すべての数5の出現回数を計算しています。

最終的なロジックを要約:
Xの右からiビットの数を計算する際に含まれます。

  1. 10 ^を乗じた最初のiビット左(高い)数値をとる(I-1)は、基準値aを得ました。
  2. i番目の桁を取り、補正値が計算されます。
    • Xより大きい場合、結果は+ 10 ^(I-1)です。
    • X未満である場合、結果があります。
    • 他のXは、i番目のビット(LSB)デジタルの右に取られている場合、最終結果は、+ B + 1であり、Bです。

コードの実装

public static int NumberOf1Between1AndN_Solution(int n) {
    int ret = process(n, 1);
    return ret;
}

public static int process(int n, int x) {
    if (n < 0 || x < 1 || x > 9) {
        return 0;
    }
    int high, low, cur, tmp, i = 1;
    high = n;
    int total = 0;
    while (high != 0) {
        //获得第i位的高位=i+1位
        high = (int) (n / Math.pow(10, i));
        //后续部分
        tmp = (int) (n % Math.pow(10, i));
        //第i位
        cur = (int) (tmp / Math.pow(10, i - 1));
        //第i位的低位=i-1位
        low = (int) (tmp % Math.pow(10, i - 1));

        if (cur == x) {
            total += (int) (high * Math.pow(10, i - 1)) + low + 1;
        } else if (cur < x) {
            total += high * Math.pow(10, i - 1);
        } else {
            total += (high + 1) * Math.pow(10, i - 1);
        }
        i++;
    }
    return total;

}
公開された117元の記事 ウォンの賞賛8 ビュー3703

おすすめ

転載: blog.csdn.net/qq_34761012/article/details/104531061