n(id、value)のペアがあります。ここで、idは1からnまでの整数で、valueは文字列です。同じIDを持つ2つの(id、value)ペアはありません。
n(id、value)ペアを任意の順序で取得し、複数回呼び出されたときにidの昇順でいくつかの値を返すようにストリームを設計します。
OrderedStreamクラスを実装します。
OrderedStream(int n)は、n個の値を受け取ることができるストリームを構築し、現在のポインターptrを1に設定します。
String [] insert(int id、String value)は、新しい(id、value)ペアをストリームに格納します。保存後:
ストリームがid = ptrで(id、value)ペアを保存する場合、id = ptrから始まるidの最長の連続増加シーケンスを見つけ、これらのIDに関連付けられた値のリストを順番に返します。次に、ptrを最後のid +1に更新します。
それ以外の場合は、空のリストが返されます。
例:
入力
["OrderedStream"、 "insert"、 "insert"、 "insert"、 "insert"、 "insert"]
[[5]、[3、 "ccccc"]、[1、 "aaaaa"]、[ 2、 "bbbbb"]、[5、 "eeeee"]、[4、 "ddddd"]]
出力
[null、[]、["aaaaa"]、["bbbbb"、 "ccccc"]、[]、[ "Ddddd"、 "eeeee"]]
OrderedStreamの解釈os = new OrderedStream(5);
os.insert(3、“ ccccc”); // Insert(3、“ ccccc”)、return []
os.insert(1、“ aaaaa”); // Insert( 1、 "
aaaaa")、return ["aaaaa" ] os.insert(2、 "bbbbb"); //挿入(2、 "bbbbb")、return ["bbbbb"、 "ccccc"]
os.insert(5 、“ eeeee”); // Insert(5、“ eeeee”)、return []
os.insert(4、“ ddddd”); // Insert(4、“ ddddd”)、return [“ ddddd”、“ eeeee 」]
アイデアは、挿入のたびにptrが指す位置に要素があるかどうかを確認し、ある場合は、その要素とその後の連続する要素を返し、ptrを追加することです。
class OrderedStream {
public:
OrderedStream(int n) {
svec.resize(n + 1);
}
vector<string> insert(int id, string value) {
vector<string> ret;
svec[id] = value;
while (1) {
if (svec.size() == ptr || svec[ptr].empty()) {
break;
}
ret.push_back(svec[ptr]);
++ptr;
}
return ret;
}
vector<string> svec;
int ptr = 1;
};