基本情報23年 特別 午後 問11 設問1

【問題を解く前に】

段落ごとに、内容をまとめてみましょう

●「プログラムの概要」


クラス
AppendableCharSequence
  (継承)→ArrayAppendableCharSequence
  (継承)→ListAppendableCharSequence

メソッド
  charAt
  length
  append
  toString

その他の情報
EXT_SIZE:配列で1回分にとる大きさ
Bucket:連結リストの要素

●「プログラム1」
  AppendableCharSequenceのインターフェース宣言

●「プログラム2」
  ArrayAppendableCharSequenceのクラス

●「プログラム3」
  ListAppendableCharSequenceのクラス

●「プログラム4」
  各プログラムの速度をはかるTestクラス


【解き方】

まず、文を読みながら、abcdeを埋めていきましょう。

●aについて
 iの範囲について聞いている。その下に、data[i]ってあるので、
 data.lengthより小さい範囲でしか動けないはず(じゃないと配列の範囲外になる)
 ・・・がdata.lengthというのが、選択肢にない。
 でも上を見ると、

   if ( data.length == length )

 とある。これだ! ってことで、aはlength
 (って、書き込んじゃいましょう)


●bについて
 こういう問題は・・・具体的に数字を入れて考えるのでした。

 プログラム3では、EXT_SIZE=10とあるので、length=12(12文字ある)とき、
index=11(最後の文字)を取り出すことを考えましょうか。
このとき
1個目(=先頭)のBucketには、0〜9
2番目のBucketは、10,11が入ります。
   10は、bucket.data[0]
   11は、bucket.data[1]に、はいってますね

さて、bをみると、その前の行

  Bucket bucket = getBucket(index)について、

getBucketを追っていくと、2番目のBucketが取れることがわかると思います。

 で、bは、11のとき、bucket.data[1]にはいっているのだから、1にならないといけません。

 これは、index % EXT_SIZEです。
 他の数字もなりますが、indexに7とか、lengthが26のとき、23とか入れてみて、
 検討してみてください。
 いくつかやると、index % EXT_SIZE以外は、おかしくなりますよ。


●cについて

 offset = 0のときに、新しい領域をとっています。
 その際、今、最後の領域が必要になってきてますね
 (bucket.nextは、今、最後の領域の.next。ここに新しい領域をセットしている)
 offset=0になる、lengthを1つとってきて見ましょう。
 length=10だと成立します。

 じゃあ、length=10のとき、getBucketがいくつだったらいいか考えましょう。
 getBucket(length)にしてしまうと、nが2になり、先頭でなく、次のbucketを返そうとします。
 (実際にはないので、落ちるはず)
 最後のbucketを返すには、length-1にする必要があります。


●dについて

 これ、数字を入れて、追っていってみてください。
 全体の長さが、26くらいにして、選択肢にあるすべてのケースをチェックすると、
 length-len以外、うまくいかず、これだと、うまい具合に、なぜかいく

 (ループの1回目、len=26、size=EXT_SIZE=10,dは26-26=0から10の手前、9まで入る
  ループの2回目、len=26-10=16,size=EXT_SIZE=10.d=26-16=10から10個分の手前、19まで入る
  ループの2回目、len=16-10=6,size=len=6,d=26-6=20から、6個分の手前、25まで入る)

 ということで、length-lenが答えっぽい

●eについて
 ArrayAppendableCharSequenceも、ListAppendableCharSequenceも呼び出しているので、
これらに共通のものでないといけない。
 ということは、「AppendableCharSequence」が入る。


(設問2に続く)