🎃

コーディングメモ / 20230910

2023/09/10に公開

この記録は、以下の本を読み進めている際の学習メモです。

Integer Reversal

# python での整数の逆順への変換
def reverse_integer(num):
  reverse_num = 0
  while num > 0:
    # 余りを算出します
    digit = num % 10
    # 商を算出します (Floor division を利用)
    num = num // 10
    reverse_num = reverse_num * 10 + digit
  return reverse_num

# 動作確認
reverse_integer(56341)
14365

注意点:

  • Python3 では、割り算の商は浮動小数点数 float が返される。
  • Floor division (//) を利用で、整数で返してくれる。
  • Ref: // floor division
    • Returns the integral part of the quotient.
// JavaScript での整数の逆順への変換
function reverse_integer(num) {
  let reverse_num = 0
  while (num > 0) {
    let digit = num % 10
    // Floor division に対応するのがないので、Math.floor() します
    num = Math.floor(num / 10)
    reverse_num = reverse_num * 10 + digit
  }
  return reverse_num
}

// 確認
reverse_integer(12345)
54321

// アロー関数で記載
const reverse_int = (num) => {
  let reverse_num = 0
  while (num > 0) {
    let digit = num % 10
    // Floor division に対応するのがないので、Math.floor() します
    num = Math.floor(num / 10)
    reverse_num = reverse_num * 10 + digit
  }
  return reverse_num
}

// 確認
reverse_int(13579)
97531
// とても簡単ですが TypeScript として
function reverse_integer(num: number) {
  let reverse_num:number = 0
  while (num > 0) {
    let digit:number = num % 10
    // Floor division に対応するのがないので、Math.floor() します
    num = Math.floor(num / 10)
    reverse_num = reverse_num * 10 + digit
  }
  return reverse_num
}

const testNum:number = 123456
const res:number = reverse_integer(testNum)
console.log(res)

  • インタビューはひたすら練習、練習、練習。
  • 久しぶりに簡単なコードを書こうとしても、なかなか思い出せないのに苦笑い。
  • TypeScript は typescriptlang でオンラインで作成。

Reverse string

# python での文字列の反転(逆順へのならべかえ)
def reverse_string(s):
  s_list = list(s)
  n = len(s_list)
  print('length: {}'.format(n))

  # 両端から入れ替えを行うので、レンジは半分まで
  for i in range(n//2):
    print('range: {}'.format(i))
    last = n-i-1
    s_list[i], s_list[last] = s_list[last], s_list[i]
  return ''.join(s_list)

# 動作確認
>>> reverse_string('abcdefghijkl')
length: 12
range: 0
range: 1
range: 2
range: 3
range: 4
range: 5
'lkjihgfedcba'

回文のチェック

// アルファベットだけを対象にしたもの
function palindrome(str) {
  /*
    Step:
    1. Remove non alphanumeric chars.
    2. Change all chars to lowercase.
    3. reverse and join.
    4. compare original and converted.
  */
  let original = str.toLowerCase().replace(/([^a-zA-Z0-9])/g, '');
  let converted = original.split('').reverse().join('');

  console.log(original);
  console.log(converted)
  return converted === original;
}

palindrome("A man, a plan, a canal. Panama");
  • この方法だと文字列を2つ生成する必要がある。
  • 単純にチェックするなら、両端どうしの同士の文字を比較すれば良い。

function isPalindrome(str) {
  const str_length = str.length
  let i = 0
  let j = str_length - 1
  while (i < j) {
    if (str[i] != str[j]) {
      return false
    }
    i++
    j--
  }
  return true
}

> isPalindrome('!aa4554aa!')
true
> isPalindrome('!aa455aa!')
false

Max Chars

  • 指定のバッファサイズにうまく文字が収まるかどうかは、文字のエンコードにも依存する。
  • 以下の点を考慮すること。
    • データ構造構造や変数のサイズ
    • 格納を想定する文字列のサイズ
    • エンコードの種別
  • abbbccccd であれば ['a':1, 'b':3, 'c':4, 'd':1] のように表現できる
    • データの圧縮や文字列の操作、パターンマッチに有効である
    • 一般的な方法としては、ハッシュテーブルに文字の出現回数を保持すること

Discussion