このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。
N1={1,2,...,1000}という配列が与えられる。ここから2の倍数番目に現れるものを取り除いた{1,3,5,...,999}をN2とする。さらにN2から3の倍数番目に現れる要素を取り除いた{1,3,7,9,13,...}をN3とする。このような操作を繰り返すとN10というものが生成できるが、このN10のn番目の要素の値を返せ。なお、N10の要素数は101になる。
私の解答はこちら。
import java.util.TreeSet; public class EratosthenSieve2 { public int nthElement(int n) { TreeSet<Integer> work = new TreeSet(); Integer[] res = null; for( int i=1 ; i<=1000; i++ ){ work.add(i); } for( int i=2 ; i<=10 ; i++ ){ res = (Integer[])work.toArray(new Integer[0]); work.removeAll(work); for( int j=0 ; j<res.length ; j++ ){ if( (j+1)%i != 0 ) work.add(res[j]); } } res = (Integer[])work.toArray(new Integer[0]); return res[n-1]; } }
得点は128.10/250、中央値は約163点。return直前のresへの代入が抜けていて嵌ること約10分...