このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
luckySetという整数の集合が与えられる。luckySetに属する2つの要素でAがBより大きく、AとBが共に正の整数である区間[A, B]は、もしAとBの間の整数がなければ不幸であると考えられる。luckySetという整数型配列と、nというluckySetの最大値を超えないような整数が与えられたとき、nを含む不幸な区間の数を返すメソッドを作成せよ。
例えば、luckySet={1, 7, 14, 10}、n=2である場合、1と7の間に2があり、2~6の整数を用いて、2を含むような区間を考えてみると、[2, 6]、[2, 5]、[2, 4]、[2, 3]の4つが該当する。
私の解答はこちら。
import java.util.Arrays;
public class UnluckyNumbers {
public int getCount(int[] luckySet, int n) {
for( int i=0 ; i<luckySet.length ; i++ ){
if( luckySet[i] == n ) return 0; // Setの値があったら区間は作れないので0
}
Arrays.sort(luckySet); // ソートして、
int[] between = new int[2]; // どこの間の区間にnがあるか検討する
for( int i=1 ; i<luckySet.length ; i++ ){
if( luckySet[i] > n ){
between[0] = luckySet[i-1] + 1;
between[1] = luckySet[i] - 1;
break;
}
}
if( n < luckySet[0] ){ // nがluckySetの最小値よりも小さい場合
between[0] = 1;
between[1] = luckySet[0] - 1;
}
int nInterval = 0; // 以下で区間の数を数える
for( int i=between[0] ; i<=between[1] ; i++ ){
if( i < n ){
nInterval += between[1] - n + 1;
}else if( i == n){
nInterval += between[1] - n;
}
}
return nInterval;
}
}
得点は153.40/250、2回目のsubmitでシステムテストクリア。1回目の提出では、nがluckySetの最小値を下回る場合の処理を間違えていた。
