2012-02-13 8 views
2

私はのコードではなく効用のヒントを求めたいと思います。私はコード化していませんが、もし私がここで良いヒントが見つからなければ、簡単にコードを書くでしょう。私の質問:順列のないaとbの間の数字

あなたが上限として下限とBとしてを取る関数listNumsがあるとします。例えば、A = 120、B = 400

について

私は1つのルールでこれらの数の間の数字を印刷したいです。上限は10 まで行くことができると順列を低減することが実行している時間が役立つだろう:私は201または210

理由を印刷スキップしたい120を持っているので、120の順列は102210201などです。

また、効率のヒントを求めています。

+0

下限についての情報はありますか? – Saphrosit

+0

「222」を印刷する必要がありますか? –

+0

コメントありがとうございました。下限は1〜10^20-1の範囲で設定できます。上限が1〜10^20になる可能性があります。 – Ali

答えて

4

私はどのように0を扱っているのか分かりません(例えば、1を出力した後、技術的には1 = 01 = 001 .. 10をスキップします。

トリックは、すべての数字が昇順(左から右)になるように数字を選択することです。

再帰的に行うことができます。 ATすべての再帰で桁を追加し、それが最近追加したものと等しいかそれ以上であることを確認します。

EDIT:生成された数値が下限値より小さい場合は、下限値以上になるように置換します。 A2A1A3 ... Ak、A3A1A2 ... Ak、...、AkA1A2 ... Ak-1のいずれかが限界内にあるかどうかを段階的にチェックします。必要が生じた場合は、Akを1桁目にしてA1A2..Ak-1の組み合わせを見つけることでこの手順を繰り返します。

例:答えは、下限が0の場合、その後99以上である最低の順列は102

+0

答えをありがとうが、ここに一つのことです。上限を99、下限を150と選択したとします。 99,100から始まる数字は101,102,103,104などユニークです。増加するルールはここでは適用できません。 – Ali

+0

@rolandbishop数字が制限よりも小さい場合は、それを並べ替えます。 – ElKamina

+0

私はそれをチェックアウトします。 – Ali

0

で、我々は3桁の数字を選択していると仮定し、組み合わせは012である場合は、下限が99であります(0、1、2、3、4、5、6、7、8、9、11、12、13、配列番号22,23,24,25,26,27,28,29,33,34,35,36,37,38,39,44,45,46,47,48,49,55,56,57、 59、66、67、68、69、77、78、79、88、89、99、111、112 ...)

このシーケンスは、整数をインクリメントすることによって簡単に形成され、キャリーがある場合は、キャリングの代わりに数字を複製します。例:73の後には73 + 1 = 74(キャリーなし)が続きます。 79の後に79 + 1 = 80(桁上がり)、したがって88が続きます。 22356999は、ゼロ以外の下限を扱う従って22357777.

# Python code 
A= 0 # CAUTION: this version only works for A == 0 ! 
B= 1000 

N= A 
while N < B: 
    # Detect zeroes at the end 
    S= str(N) 
    P= S.find('0') 

    if P > 0: 
     # Replicate the last nonzero digit 
     S= S[:P] + ((len(S) - P) * S[P-1]) 
     N= eval(S) 

    # Next candidate 
    print N 
    N+= 1 

、22356999 + 1 = 22357000が続くことは、より多くの注意が必要です。

関連する問題