[2019 Kakao冬季実習]Q 02管(JAVA)


質問する
説明:
数え切れない、順序付けされた、またはある順序で並べられた要素の集合を「tuple」(tuple)と呼ぶ.n個の要素を有するtupleをn tupleと呼び、以下のように表すことができる.
  • (a1, a2, a3, ..., an)
  • Tupleには以下の性質があります.
    重複する要素
  • が存在する可能性があります.ex : (2, 3, 1, 2)
  • 要素には固定された順序があり、要素の順序が異なる場合、異なるトーンである.ex : (1, 2, 3) ≠ (1, 3, 2)
  • tupleの要素数は限られている.
  • 要素の個数がnであり、繰り返し要素のtuple (a1, a2, a3, ..., an)がない場合(ただし、a 1,a 2,...,anは自然数)、集合記号「{」,「}」を用いて表すことができる.
  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}
  • 例えば、tupleが(2、1、3、4)である場合
  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • に表示されます.この場合、集合は要素順序の影響を受けません.
  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}
  • 同じ例(2、1、3、4)をすべて表します.
    パラメータに特定のtupleを表す集合を含む文字列sが与えられた場合、解関数を完了し、sで表されるtupleを配列に戻します.
    せいげんじょうけん
  • sの長さは5以上100000以下である.
  • sは、数字と「{」、「}」、「,」のみで構成されています.
  • の数字は0で始まりません.
  • sは、繰り返し要素のないtupleを常に正確に表す.
  • sで表されるtupleの要素は100000より大きい自然数である.
  • 入力は、
  • を返す配列の長さが1または500未満の場合にのみ与えられます.
  • I/O例
    sresult"{{2},{2,1},{2,1,3},{2,1,3,4}}"[2, 1, 3, 4]"{{1,2,3},{2,1},{1,2,4,3},{2}}"[2, 1, 3, 4]"{{20,111},{111}}"[111, 20]"{{123}}"[123]"{{4,2,3},{3},{2,3,4,1},{2,3}}"[3, 2, 4, 1]
    に答える
    説明:
  • 文字列をコレクション単位でグループ化し、コレクション内の要素の個数で順番にソートします.
  • 小さい頃から
  • セットを探索し,追加した数字を探索して結果配列に追加した.
  • 新学
    文字列の切り分けが漠然としていたので、この機会にsplit()trim()などのメソッド機能を正確に検索し、羽根で整理しました.
    また、集合を1つずつ検索して追加する数字を探す場合は、contains()で照合を行い、add()で区切られた方法で記述されていた.
    if (!numbers.contains(element)) {
        result[index++] = Integer.parseInt(element);
        numbers.add(element);
    }
    しかし,numbers.add(element)自体が結リンゴ値として成功するとtrueが返され,この要素がsetに既に存在する場合falseが返されるため,条件文に直接入れる方法もあることが分かった.したがって、より簡潔なコードは以下のようになります.
    if (numbers.add(element)) result[index++] = Integer.parseInt(element);
    setに一度アクセスするだけで済むので、効率が高く、見た目も明確です.
    コード#コード#
    import java.util.*;
    
    class Solution {
        
        public int[] solution(String s) {
            String[] parsedChunks = parseChunks(s);
            int[] result = new int[parsedChunks.length];
            int index = 0;
            Set<String> numbers = new HashSet<>();
            for (String chunk : parsedChunks)
                for (String element : chunk.split(","))
                    if (numbers.add(element)) result[index++] = Integer.parseInt(element);
            return result;
        }
    
        private String[] parseChunks(String s) {
            String[] chunks = s.substring(2, s.length() - 2).split("},\\{");
            return orderChunks(chunks);
        }
    
        private String[] orderChunks(String[] chunks) {
            String[] result = new String[chunks.length];
            for (String chunk : chunks) {
                String[] elements = chunk.split(",");
                result[elements.length - 1] = chunk;
            }
            return result;
        }
    }