技術ブログ

[2日目] Palindromeを解いてみた

はじめに

こんにちは!ききてもです!今日も解いたので、アプローチ方法など参考にしてください。

問題の内容

numsという数字を反対から読んでも同じ数字になるようにする。 (ex) 1221→ture 10→false みたいな感じ。。。

アプローチ方法

 
    1. 文字列を使う方法
str(x) == str(x)[::-1] メリット:簡単 デメリット:intをstrに変換しないといけないので、時間、空間それぞれ O(n)。  
    1. そのまま整数を反転する
x == reverse(x) メリット:シンプル デメリット:無駄が多い O(n)。  
    1. 半分だけ反転(規則性を見つける:O(logN))
(ex)x=12321 この場合、3を無視して考えると右2桁、左2桁が同じになれば、反転しても同じになることがわかる。 このような考え方で行った場合、以下のステップで答えを導くことができる。  
  • x//10をして一桁ずつ消していく。
  • halfという変数を定義してhalf*10+x%10をたしてxより大きくなるまで比較する。
  • 奇数の場合と偶数の場合で2通り考えないといけない。
  • 奇数の場合、真ん中の数がhalfに追加されるため、x==half//10
  • 偶数の場合、真ん中に当たる数がないのでx==halfになる。

まとめ

反転するとき、文字列に変換したりしがちだが、なにも考えずに書くとオーバーフローのリスクになる。それを回避するために、規則性を見つけて前半分と後ろ半分を比較して同じになればいいと考える。今回行った数値の桁を操作して逆順を作り、比較する手法は他にも以下のときに役立つ。
  • 整数の反転
  • 整数を桁ごとに分解
  • カプリーカ数の判定
  • リード数の取得