ティムの答えは、明らかにインタビュアーが求めているものです。
ただし、ルールを破ることで、より良い結果を得ることができます。
d. 一般に、非パワーはパワーよりも速く識別される必要があります。
BoppreH が指摘しているように、除算がないため、下向きではなく上向きにカウントする答えは (少なくともほとんどの言語とプラットフォームで) はるかに高速になります。彼の実装は、最悪の場合でも Tim の実装よりもほぼ 1 桁高速です。
もちろん、BoppreH の平均的なケースと最良のケースは基本的に最悪のケースと同じですが、Tim の場合は最良のケースがはるかに優れています。しかし、多くの場合、最悪のケースは非常に重要であるため、検討する価値のあるトレードオフであることは確かです。
または:
を。+ - * / % のみで、数学ライブラリやビット演算はありません
ティムのソリューションの遅い部分は除算演算子ですが、実際には必要ありません。、およびn % 2 == 1
と置き換えることができます。これらは同等であることが保証されており、突然、最悪の場合は 1 桁速くなり、BoppreH よりも速くなります。n & 1
n = n / 2
n = n >> 1
これは、たとえば C ではコンパイラに期待されるようなことですが (もう一度、C で2**100000
数学ライブラリを使用せずに処理してみてください…)、Python では (少なくとも CPython — おそらく PyPy を試してみる価値があります。 Jython や IronPython など)、手動で行う必要があります。そして、あなたは許可されるべきです。
そして、これが、この種のインタビューの質問が、さらなる議論の出発点である場合を除いて、愚かで無意味である理由です. 彼らが明らかに探している答えは、多くの場合、実際のコードで使用したい答えではありません。