0Pricing
DSA Interview Prep · レッスン

面接のためのPython文字列API

split、join、replace、find、ord/chr、文字列フォーマットなど、解析や変換を扱う面接問題で頻出するパターンを実践します。

「面接のためのPython文字列API」はCoddyKit上の無料DSA Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDSA Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DSA Interview Prepコースには全4レッスンが含まれています。

Pythonの文字列はイミュータブル

Python の文字列はイミュータブルであり、文字をインプレースで変更することはできません。文字列を変更しているように見えるすべての文字列操作は、実際には新しい文字列を作成します。そのため、s[0] = 'X' は TypeError を発生させます。インプレースで操作する必要がある場合は、まず文字列を文字のリストに変換して処理し、その後 ''.join(chars) で再構築します。これは、文字列の変更を扱う問題で標準的な面接向けパターンです。

s = 'hello'
# s[0] = 'H'  # TypeError!

# In-place mutation pattern:
chars = list(s)
chars[0] = 'H'
result = ''.join(chars)
print(result)  # 'Hello'

# Reversing a string
print(s[::-1])           # 'olleh'
print(''.join(reversed(s)))  # 'olleh'

split() と join():解析と構築

s.split(sep) は区切り文字で文字列を分割し、部分文字列のリストを返します。sep=None(デフォルト)の場合は、任意の空白で分割し、空文字列を破棄します。これは、空白区切りの入力を解析するのに適しています。'sep'.join(iterable) は、文字列を区切り文字でつないで連結します。' '.join(words) という書き方は、リストから空白区切りの文字列を効率よく構築する方法です。ループ内で + を使うことは避けてください。

# split
sentence = '  hello   world  '
words = sentence.split()    # ['hello', 'world']
print(words)

csv = 'a,b,c,d'
parts = csv.split(',')      # ['a', 'b', 'c', 'd']
print(parts)

# join
print(' '.join(words))      # 'hello world'
print(','.join(['x','y','z']))  # 'x,y,z'

# Reverse words in a sentence
print(' '.join(sentence.split()[::-1]))  # 'world hello'

find()、index()、in

s.find(sub) は sub が最初に現れる位置のインデックスを返し、見つからない場合は -1 を返します。s.index(sub) も同じ処理を行いますが、存在しない場合は ValueError を発生させます。未処理の例外を避けるため、面接用のコードでは find を優先してください。文字列に対する in 演算子は、find と同じ O(n×m) の部分文字列検索です。start と end のオプション引数を使うと、コピーを作成せずにスライスの範囲内を検索できます。

s = 'abcabcabc'
print(s.find('bc'))          # 1  (first occurrence)
print(s.find('bc', 2))       # 4  (search from index 2)
print(s.find('xyz'))         # -1 (not found)
print('abc' in s)            # True

# Count occurrences manually
count = 0
start = 0
while True:
    idx = s.find('bc', start)
    if idx == -1: break
    count += 1
    start = idx + 1
print(count)  # 3

replace()、strip()、大文字・小文字変換メソッド

s.replace(old, new, count=-1) は、すべての(または最初の count 個の)出現箇所を置換した新しい文字列を返します。s.strip() は、先頭と末尾の空白(または指定した文字)を削除します。lower()、upper()、capitalize()、swapcase() などの大文字・小文字変換メソッドは新しい文字列を作成します。これらは文字列を変更するのではなく、戻り値を返すことを忘れないでください。大文字と小文字を区別しない問題では、比較前に大文字・小文字を統一することが不可欠です。

s = '  Hello, World!  '
print(s.strip())          # 'Hello, World!'
print(s.strip().lower())  # 'hello, world!'

print('banana'.replace('a', 'o'))   # 'bonono'
print('banana'.replace('a', 'o', 2)) # 'bonona'

# Normalise for comparison
def same_ignoring_case(a, b):
    return a.lower() == b.lower()

print(same_ignoring_case('Racecar', 'racecar'))  # True

startswith()、endswith()、isalnum()

文字列の判定メソッドはブール値を返し、パターンの長さを k とすると O(k) です。s.startswith(prefix) と s.endswith(suffix) は、複数の候補を調べるためにタプルを受け取れます。s.isalpha()、s.isdigit()、s.isalnum()、s.isspace() は文字種を判定します。これらは、有効な回文、有効な数値、URL解析などの面接問題で使われます。

print('hello'.startswith('hel'))   # True
print('hello'.endswith(('lo', 'la')))  # True

# isalnum for palindrome filtering
def clean(s):
    return ''.join(c.lower() for c in s if c.isalnum())

print(clean('A man, a plan, a canal: Panama'))
# 'amanaplanacanalpanama'
print(clean('123abc!@#'))
# '123abc'

ord()、chr()、ASCII演算

ord(c) は文字 c の Unicode コードポイントを返します。chr(n) は整数を文字に変換します。小文字の場合、ord(c) - ord('a') によって 0〜25 が得られます。これは、ハッシュマップを使わず、サイズ26固定の頻度配列を構築する簡潔な方法です。英語アルファベットを扱う場合、実際の処理ではこちらのほうが高速です。この手法はアナグラムや回文の問題で使われます。

print(ord('a'))   # 97
print(ord('z'))   # 122
print(chr(65))    # 'A'

# Frequency array for lowercase letters
def char_freq(s):
    freq = [0] * 26
    for c in s:
        freq[ord(c) - ord('a')] += 1
    return freq

print(char_freq('anagram'))  # [3,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0]
# index 0='a'(3), 6='g'(1), 12='m'(1), 17='r'(1)

出力の文字列フォーマット

コーディング面接では、整った出力が重要になることもあります。Python には、%-formatting(古い形式)、.format()(従来の形式)、f-string(現代的で推奨される形式)の3つのフォーマット方法があります。f-string は最も読みやすく、式を直接記述できます。f'{value:.2f}' は浮動小数点数を小数点以下2桁でフォーマットします。数値のフォーマット、文字列のパディング、表の出力をすばやく行えると、緊張した状況でのデバッグ時間を短縮できます。

name = 'Alice'
score = 95.678

# f-string (preferred in interviews)
print(f'{name}: {score:.1f}')      # Alice: 95.7
print(f'{name:>10}: {score:05.1f}') # right-align

# Zero-pad an integer
print(f'{42:04d}')   # 0042

# Join and format a list
nums = [1, 2, 3, 4]
print(', '.join(str(n) for n in nums))  # '1, 2, 3, 4'

join()による効率的な文字列構築

ループ内で + による文字列連結を行うと、反復のたびに新しい文字列が作成され、n 文字全体で合計 O(n²) のコストがかかります。正しいパターンは、各部分をリストに追加し、最後に ''.join(parts) を呼び出す方法です。これなら O(n) になります。これは、Python で最もよくあるパフォーマンス上のアンチパターンの1つです。面接でこのトレードオフに言及すると、Python のメモリモデルを理解していることを示せます。

# SLOW: O(n^2) due to repeated string allocation
def build_bad(chars):
    s = ''
    for c in chars:
        s += c  # creates a new string each time!
    return s

# FAST: O(n)
def build_good(chars):
    parts = []
    for c in chars:
        parts.append(c)
    return ''.join(parts)  # single allocation

# Or even more concise:
def build_best(chars):
    return ''.join(chars)

print(build_best(['h','e','l','l','o']))  # 'hello'

文字列から整数と浮動小数点数を解析する

文字列と数値の相互変換は、解析問題の基本です。int(s) と float(s) は数値文字列を解析しますが、入力が無効な場合は ValueError を発生させます。より安全に解析するには、try-except ブロックを使います。文字列メソッドの isdigit() と isnumeric() を使って、変換前に入力を検証することもできます。「atoi」(文字列から整数への変換)のような問題では、先頭の空白、符号、オーバーフローを処理する必要があります。

def my_atoi(s):
    s = s.lstrip()  # remove leading spaces
    if not s: return 0
    sign = 1
    idx = 0
    if s[0] in '-+':
        sign = -1 if s[0] == '-' else 1
        idx = 1
    num = 0
    while idx < len(s) and s[idx].isdigit():
        num = num * 10 + int(s[idx])
        idx += 1
    result = sign * num
    INT_MAX, INT_MIN = 2**31 - 1, -(2**31)
    return max(INT_MIN, min(INT_MAX, result))

print(my_atoi('   -42'))          # -42
print(my_atoi('4193 with words'))  # 4193

アルゴリズム問題での文字列スライス

文字列スライスは頻繁に使われますが、隠れたコストがあります。s[i:j] は長さ j-i の新しい文字列を作成するため、O(j-i) 時間がかかります。部分文字列を再帰関数に渡す必要がある場合は、実際の部分文字列の代わりにインデックス(start、end)を渡すことを検討してください。これにより、O(n²) の割り当てによるオーバーヘッドを避けられます。この最適化は、多数の部分文字列を検査する最長回文部分文字列のような問題で重要です。

# Naive: O(n^3) because slicing inside nested loops
def is_palindrome_naive(s):
    return s == s[::-1]  # O(n) slice + O(n) compare

# Pass indices to avoid allocating substrings
def is_palindrome_range(s, left, right):
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1; right -= 1
    return True  # O(right-left) time, O(1) space

print(is_palindrome_range('racecar', 0, 6))  # True
print(is_palindrome_range('hello',   0, 4))  # False

文字列面接クイックリファレンス

面接で使えるよう、次の文字列メソッドを頭に入れておいてください:

  • split / join — 解析と構築
  • strip / lstrip / rstrip — 空白のトリミング
  • lower / upper — 大文字・小文字の正規化
  • find / index — 部分文字列の検索
  • replace — 置換
  • isalnum / isalpha / isdigit — 文字クラスの判定
  • ord / chr — 固定アルファベットの問題でのASCII演算
  • startswith / endswith — 接頭辞・接尾辞の判定

# Combining methods: reverse words, preserve spaces
def reverse_words(s):
    return ' '.join(reversed(s.split()))

print(reverse_words('  hello   world  '))
# 'world hello'

# Check anagram using sorted strings
def is_anagram(s, t):
    return sorted(s) == sorted(t)

print(is_anagram('anagram', 'nagaram'))  # True
print(is_anagram('rat', 'car'))          # False

理解度チェック

このレッスンのData Structures & Algorithms — Coding Interview Prepの概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、次のことを学びました: Pythonの文字列はイミュータブルであるため、変更するにはリストに変換してから変更し、最後に再結合する必要があります。また、ord/chrを使うと、小文字の問題でサイズ26の固定長頻度配列を作成できます。これはアルファベットが限定されている場合、ハッシュマップより高速です。さらに、ループ内で+を使って文字列を構築するとO(n²)のコストがかかるため、必ずリストに追加して、最後に''.join()を使うことでO(n)にしてください。次は、部分文字列問題のスライディングウィンドウ技法を学びます。

よくある質問

「面接のためのPython文字列API」レッスンは無料ですか?

はい。「面接のためのPython文字列API」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DSA Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DSA Interview Prepコースには全4レッスンが含まれています。

「面接のためのPython文字列API」で何を学びますか?

split、join、replace、find、ord/chr、文字列フォーマットなど、解析や変換を扱う面接問題で頻出するパターンを実践します。 ブラウザで直接実行するハンズオンコードでDSA Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

DSA Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDSA Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「面接のためのPython文字列API」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDSA Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのDSA Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 面接のためのPython文字列API
  2. 部分文字列のスライディングウィンドウ
  3. アナグラムと文字頻度マップ
  4. 文字列のエンコード、反転、回文
← DSA Interview Prepに戻る