Pythonで数値が0と1のみで構成されているかどうかを判定する方法
はじめに
ある整数 num が与えられたとき、その数値が「0」と「1」のみで構成されているかどうかを判定する方法を解説します。
例えば、入力が num = 101101 の場合、すべての桁が 0 か 1 なので、出力は True になります。一方、num = 102 のように 2 が含まれていれば、出力は False となります。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- num の各桁の数字をすべて要素として持つ新しい集合(set)
digits_setを作成する digits_setから 0 を削除するdigits_setから 1 を削除するdigits_setのサイズが 0(空)であればTrueを返す- それ以外の場合は
Falseを返す
このアプローチのポイントは、集合には重複した要素が保存されないという特性を利用している点です。0 と 1 以外の数字が一つでも含まれていれば、削除後に集合が空にならず、即座に判定できます。
サンプルコード
理解を深めるために、以下の実装を見てみましょう。
def solve(num):
digits_set = set()
while num > 0:
digit = num % 10
digits_set.add(digit)
num = int(num / 10)
digits_set.discard(0)
digits_set.discard(1)
if len(digits_set) == 0:
return True
return False
num = 101101
print(solve(num))コードの解説
- 桁の抽出:
num % 10で最下位の桁を取り出し、int(num / 10)で数値を一桁ずつ右にずらしていきます。これをnumが 0 になるまで繰り返すことで、すべての桁を取得できます。 - 集合への追加: 取り出した各桁を
digits_setに追加します。同じ数字が複数回現れても、集合には一度だけ保存されます。 - 判定:
discard()メソッドで 0 と 1 を安全に削除し(要素が存在しなくてもエラーになりません)、残った要素がなければTrueを返します。
実行結果
入力
101101
出力
True
まとめ
このアルゴリズムは、数値の桁数を n とすると O(n) の時間計算量で動作し、非常にシンプルかつ効率的です。文字列変換を使わずに算術演算だけで実装できるため、数値処理の基礎的なテクニックとしても役立ちます。
-
Pythonで数値の各桁の合計を求める方法(文字列を使わない実装)
ある数値 num が与えられたとき、その各桁の数字をすべて足し合わせた合計を求めます。ここでは、文字列に変換せず、数値演算だけで解く方法を紹介します。たとえば、入力が num = 512 の場合、5 + 1 + 2 = 8 となるため、出力は 8 になります。解き方の手順合計を格納する変数 sum を 0 で初期化します。num が 0 になるまで、次の処理を繰り返します。sum に「num を 10 で割った余り」(最下位の桁)を加算します。num を「10 で割った商」(整数)で更新します。繰り返しが終わったら sum を返します。アルゴリズムのポイントこの手法では、「10 で割った余り」
-
Pythonで文字列に英字と数字がそれぞれ1つ以上含まれているか判定する方法
Pythonである文字列に「少なくとも1つの英字」と「少なくとも1つの数字」の両方が含まれているかどうかを判定したい場面は、パスワードのバリデーションなどでよくあります。最も手軽な方法は正規表現(regular expressions)を使うことです。re.match(regex, string)を利用すれば、指定した文字列に英字と数字が両方存在するかを一度にチェックできます。正規表現を使った判定方法以下の例では、先読み(lookahead)と呼ばれる?=構文を使って、文字列中に英字と数字がそれぞれ1つ以上あることを確認しています。import re print(bool(re.match(