『サマーインターン2011問題』 に挑戦

サマーインターン2011問題 | Preferred Research
思いついた方法が 解かれてブックマークされている方 と違ったので。

半分より多く現れるなら文字のバイト位置をカウントして半分より大きいバイト位置だけ拾った文字を出力すればよいのではないかと思った。

String s = "AAABCCCAA"
int[] counts = new int[8]
for (byte b in s.bytes)
  for (int i in 0..<8)
    if (b & (1 << i)) counts[i]++
byte b = 0
for (int i in 0..<8)
  if (counts[i] > s.size().intdiv(2)) b |= (1 << i)
assert 'A' == (b as char)

修正

eachWithIndex は分かりづらいので for に変更

2011-07-29 修正

入力を間違えていたので修正
"AAABCCCA" -> "AAABCCCAA"