Pythonで10進数をHexspeak(ヘックススピーク)表現に変換する方法
10進数の数値は、まず大文字の16進数文字列に変換し、その後、数字の 0 をすべて文字 O に、数字の 1 をすべて文字 I に置き換えることで、Hexspeak(ヘックススピーク)表現へと変換できます。
この表現が有効とみなされるのは、その結果が {"A", "B", "C", "D", "E", "F", "I", "O"} の集合に含まれる文字だけで構成されている場合のみです。
ここで、10進整数 N を表す文字列 num が与えられます。N のHexspeak表現が有効であればそれを返し、無効な場合は "ERROR" を返す必要があります。たとえば num = "257" の場合、257 は16進数で 101 となるため、出力は "IOI" になります。
解決のための手順
この問題を解くには、以下の手順に従います。
- x := 数値を16進形式に変換したもの
- ans := 空文字列
- 辞書を作成し、(10 : 'A', 11 : 'B', 12 : 'C', 13 : 'D', 14 : 'E', 15 : 'F', 1 : 'I', 0 : 'O') を格納する
- x 内の各文字 i について:
- i が辞書 d に存在すれば ans := ans + d[i] とし、存在しなければ "ERROR" を返す
- 最後に ans を返す
実装例
理解を深めるために、以下の実装を見てみましょう。
class Solution(object):
def convertToHex(self, n):
res = []
while n > 0:
res.append(n % 16)
n //= 16
return res[::-1]
def toHexspeak(self, num):
x = self.convertToHex(int(num))
ans = ""
d = {10:"A", 11:"B", 12:"C", 13:"D", 14:"E", 15:"F",0:"O",1:"I"}
for i in x:
if i in d:
ans += d[i]
else:
return "ERROR"
return ans
ob1 = Solution()
print(ob1.toHexspeak("659724"))このコードでは、まず convertToHex メソッドが数値を16進数の各桁(リスト形式)に分解します。次に toHexspeak メソッドが各桁を対応する文字にマッピングし、2〜9 の数字が含まれていた場合は "ERROR" を返します。
入力
"659724"
出力
"AIIOC"
659724 を16進数に変換すると A110C となり、1 を I、0 を O に置き換えることで "AIIOC" という結果が得られます。
-
Pythonで重複文字を含まない最長部分文字列を求めるアルゴリズム
文字列が与えられたとき、同じ文字が繰り返されない最長の部分文字列(連続した部分)の長さを求める問題です。例えば、文字列が「ABCABCBB」である場合、答えは 3 になります。これは、重複する文字を一切含まない部分文字列として「ABC」(長さ3)が存在するためです。解法のアプローチこの問題は、スライディングウィンドウ(尺取り法)とハッシュマップを組み合わせることで効率的に解くことができます。各文字が最後に出現した位置を記録しながら、ウィンドウの左端を適切に移動させるのがポイントです。アルゴリズムの手順i := 0、j := 0 と初期化し、文字の出現位置を記録するためのマップ(辞書)を用意しま
-
Pythonで平方根を求める:ライブラリ不要の二分探索によるsqrt(x)の実装方法
非負の整数 x が与えられたとき、標準ライブラリの関数を使わずに x の平方根を求めることを考えます。つまり、sqrt(x) を計算する独自の関数を実装する必要があります。この関数では、結果の小数点以下は切り捨て、整数部分のみを返します。 例を挙げると、x = 4 の場合は答えは 2 です。x = 8 の場合も答えは 2 になります。なぜなら sqrt(8) ≈ 2.82842 ですが、整数部分だけを取り出すためです。 アルゴリズムの考え方:二分探索 この問題は二分探索(バイナリサーチ)を使うと効率的に解けます。平方根の候補となる範囲を半分ずつ絞り込んでいくことで、高速に答えを求められます。