このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。
sequence[]という整数の配列が与えられる。これから重複した要素を取り除きたい。ただし、どの要素も最後に現れたものを残すようにせよ。唯一の要素は変化の内容にしなければならない。
私の解答はこちら。
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class SimpleDuplicateRemover {
public int[] process(int[] sequence) {
List<Integer> seq = new ArrayList<Integer>();
for( int i : sequence ){
seq.add(i);
}
Collections.reverse(seq); // 配列が逆順になる
Set<Integer> uniq = new LinkedHashSet<Integer>();
for( int i : seq ){
uniq.add(i); // そこから最初に現れたものからなる集合を作る
}
seq = new ArrayList<Integer>(uniq); // さらにひっくり返すと答になる。
Collections.reverse(seq);
int[] ret = new int[seq.size()];
for( int i=0 ; i<ret.length ; i++ ){
ret[i] = seq.get(i);
}
return ret;
}
}この問題はギブアップ。集合ををひっくり返すCollections.reverse()を知っていれば簡単だったのだが。また、HashSetという入力順序を維持するSetがあることは大変ためになった。
0 件のコメント:
コメントを投稿