基本情報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に続く)