この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 件のコメント:
コメントを投稿