剣指offerシリーズ-面接問題46.数字を文字列に訳す
7683 ワード
文書ディレクトリ 1. タイトル 2. 解題構想 2.1再帰 2.2反復(ダイナミックプランニング) 3. コード実装 3.1再帰 3.2文字列 を巡回 3.3数字は残りの を求めます 4. まとめ 5. 参考文献 1.テーマ
1つの数字を与えて、私達は以下の規則に従ってそれを文字列に訳します:0は“a”に訳して、1は“b”に訳して、......、11は“l”に訳して、......、25は“z”に訳します.1つの数字に複数の翻訳がある可能性があります.プログラミングして1つの関数を実現して、1つの数字がどれだけ異なる翻訳方法があるかを計算してください.
2.問題の解き方
詳しくは試験問題46にお会いします.数字を文字列に訳す(ダイナミックプランニング、明確な図解)
2.1再帰
上から下へ
例えば、入力数1068385920は、末尾の20が単独の2と0とみなすことができるため、20とみなすこともできる.すなわち、「106838590」=「1068388592」+「0」+「10683859」+「20」とみなすことができるので、f(10683885920)=f(1068388592)+f(106838859)が106885930であれば、f(10683885930)=f(1068388593)が10~25の範囲内の数には2つの分配方法がある.この範囲にない数は1つの分配方法だけがこの法則に従って再帰すればよい.
2.2反復(動的計画)
下から上へ,初期条件と繰返し式に基づいて次の状態の結果を推定した.
前のカエルが階段を跳ぶような問題がある.10~25の範囲内の数には2つの分配方法があり、この範囲外の数は1つの分配方法a,b=1,1 if 10<=num<=25 a,b=b,a+b else:a,b=b,b
3.コード実装
3.1再帰
もちろん文字列で再帰することもできますが、数字のほうがいいです.
3.2文字列遍歴
もちろん右から左へ遍歴することもできますが、結果は同じです.
3.3数字の余剰を求める
数字で余分を求めてより少ない空間を使う.
4.まとめ
通常、数字に関するアルゴリズムに出会ったら、余を求めたり、商を求めたりする操作が望ましいが、文字列に変換して処理することはできない.
5.参考文献
[1]剣指offer叢書[2]剣指Offer-有名企業の面接官が典型的なプログラミング問題を詳しく話す
1つの数字を与えて、私達は以下の規則に従ってそれを文字列に訳します:0は“a”に訳して、1は“b”に訳して、......、11は“l”に訳して、......、25は“z”に訳します.1つの数字に複数の翻訳がある可能性があります.プログラミングして1つの関数を実現して、1つの数字がどれだけ異なる翻訳方法があるかを計算してください.
2.問題の解き方
詳しくは試験問題46にお会いします.数字を文字列に訳す(ダイナミックプランニング、明確な図解)
2.1再帰
上から下へ
例えば、入力数1068385920は、末尾の20が単独の2と0とみなすことができるため、20とみなすこともできる.すなわち、「106838590」=「1068388592」+「0」+「10683859」+「20」とみなすことができるので、f(10683885920)=f(1068388592)+f(106838859)が106885930であれば、f(10683885930)=f(1068388593)が10~25の範囲内の数には2つの分配方法がある.この範囲にない数は1つの分配方法だけがこの法則に従って再帰すればよい.
2.2反復(動的計画)
下から上へ,初期条件と繰返し式に基づいて次の状態の結果を推定した.
前のカエルが階段を跳ぶような問題がある.10~25の範囲内の数には2つの分配方法があり、この範囲外の数は1つの分配方法a,b=1,1 if 10<=num<=25 a,b=b,a+b else:a,b=b,b
3.コード実装
3.1再帰
もちろん文字列で再帰することもできますが、数字のほうがいいです.
class Solution:
def translateNum(self, num: int) -> int:
"""
"""
if 0 <= num <= 9: return 1
a = num % 100
if 10 <= a <= 25:
return self.translateNum(num//100) + self.translateNum(num//10)
else:
return self.translateNum(num//10)
3.2文字列遍歴
もちろん右から左へ遍歴することもできますが、結果は同じです.
class Solution:
def translateNum(self, num: int) -> int:
s = str(num)
a = b = 1
for i in range(2, len(s) + 1):
tmp = s[i - 2:i]
c = a + b if "10" <= tmp <= "25" else a
b = a
a = c
return a
3.3数字の余剰を求める
数字で余分を求めてより少ない空間を使う.
class Solution:
def translateNum(self, num: int) -> int:
a = b = 1
y = num % 10
while num != 0:
num //= 10
x = num % 10
tmp = 10 * x + y
c = a + b if 10 <= tmp <= 25 else a
a, b = c, a
y = x
return a
4.まとめ
通常、数字に関するアルゴリズムに出会ったら、余を求めたり、商を求めたりする操作が望ましいが、文字列に変換して処理することはできない.
5.参考文献
[1]剣指offer叢書[2]剣指Offer-有名企業の面接官が典型的なプログラミング問題を詳しく話す