これは実際には興味深い問題です。明らかに、これを単なる力ずく以上のものにするためにやりたいことは、最上位桁を使用し、それらを最下位桁の位置に配置して回文を形成することです。(回文とオリジナルの違いを「距離」と呼ぶことにします)
そのことから、数値の最下位半分は無視できると言うつもりです。これは、実際には問題ではないためです (距離を決定する場合は重要ですが、それだけです)。
抽象的な数字を取ります: ABCDEF
. A、B、C、D、E、F はすべてランダムな数字です。繰り返しますが、D、E、F は、回文を決定するために必要ではありません。数字の前半を後半にミラーリングすることです。明らかに、逆にしたくはありません。そうしないと、より有効な数字を変更して、元の数字から大きく離れてしまいます。
したがって、回文は になりABCCBA
ますが、既に述べたように、これが常に最短距離であるとは限りません。ただし、「解決策」はまだ形式でXYZZYX
あるため、変更している数字の「重要性」を最小限に抑えることを考えると、C (または真ん中の数字) を変更する必要があることを意味します。
一歩下がって、その理由を見てみましょう。ABCCBA
- 最初は変更したくなるかもしれませんが
A
、これは最も重要でない位置、つまり右端にあるためです。ただし、最も重要でないものを変更するには、最も重要なものを変更する必要があります。アウトA
です。
- についても同じことが言える
B
のでC
、最終的に選択した数字になります。
では、より近い可能性のある数値を取得するために変更C
する必要があることがわかったので、境界について考える必要があります。ABCDEF
は私たちの元の数でありABCCBA
、最も近い回文ではない場合、何が考えられるでしょうか? 上記の少し回り道に基づいて、 を変更することで見つけることができますC
。したがって、ABCDEF
より大きい場合ABCCBA
と より小さい場合の 2 つのケースがありABCCBA
ます。
ABCDEF
より大きい場合はABCCBA
、 に 1 を加算しC
ます。T = C+1
これで number が得られましたABTTBA
。したがって、それを確認するためにテストし、そうであれば、それが最も近い回文ABCDEF - ABCCBA > ABCDEF - ABTTBA
であることがわかります。ABTTBA
C にこれ以上変更を加えると、私たちはますます遠ざかってしまいます。
ABCDEF
または、が より小さい場合はABCCBA
から 1 を引きますC
。としましょうV = C-1
。がありABVVBA
、上記と同じようにテストします:ABCDEF - ABCCBA > ABCDEF - ABVVBA
そして、同じ解決策が得られます。
トリックは、ABCDEF
は常に と の間ABTTBA
にありABVVBA
、これらの数の間の他の回文は だけですABCCBA
。したがって、ソリューションには3つのオプションしかありません。と比較ABCDEF
するABCCBA
場合は、2 のみを確認する必要があります。
これを任意のサイズの数値に適応させるのは難しくないと思います。桁数が奇数の場合は、単にABCBA
、ABVBA
などABTBA
...
あなたの例のように、911を取ります.
- 最後の 1 は無視して、前半のみを取得します (切り上げ)。だから91X。
- X を 9 に置き換えます。これは 919 です。これは中間点です。
- 元の 911 が 919 より小さいことがわかっているので、中間の数値から 1 を引いて、2 番目の (下限) 909 を取得します。
- 比較
911 - 919
して911 - 909
- 差が最も小さいものを返します。
したがって、これにより一定時間アルゴリズムが得られます:)
コメントで指摘されているように、これは最悪の場合は一定時間ではありませんが(おっと)、ブルートフォースアプローチよりも確かに優れています。
これはあなたが持っているもののようですが、それ以外の場合は小さなプログラミングエラーのように見えるので、うまくいけば問題を明らかにするために詳しく説明したいと思いました.