链接:https://leetcode.cn/problems/design-an-ordered-stream/solution/jian-dan-mo-ni-by-xun-ge-v-d8sm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
解题思路
题意需要设计一个流,以 任意 顺序获取 n 个 (id, value) 对,并在多次调用时 按 id 递增的顺序 返回一些值。
根据题目意思直接模拟即可。
- 当 id == ptr,枚举一下从ptr下标开始,之后是否存在字符串,存在就一起输出即可
对于字符串可以用指针索引,不需要申请额外空间保存
代码
typedef struct {//结构体数组保存
int ptr;//ptr下标
char ** str;//保存下标对应字符串
int * ans;//记录那些位置被用了
int n;//总大小
} OrderedStream;
OrderedStream* orderedStreamCreate(int n) {//初始化变量,对于字符串可以用指针索引,不需要申请额外空间保存
OrderedStream * obj = (OrderedStream *)malloc(sizeof(OrderedStream));
obj->ptr = 1;
obj->n = n+1;
obj->str = (char **)malloc(sizeof(char *) * (n+1));
obj->ans = (int *)malloc(sizeof(int) * (n+1));
memset(obj->ans, 0, sizeof(int) * (n+1));
return obj;
}
char ** orderedStreamInsert(OrderedStream* obj, int idKey, char * value, int* retSize) {
*retSize = 0;
obj->str[idKey] = value;
obj->ans[idKey] = idKey;//先入队
if(obj->ptr == idKey)//枚举后面是否存在,一起输出
{
char ** res = (char **)malloc(sizeof(char *) * obj->n);
for(obj->ptr; obj->ptr < obj->n; obj->ptr++)
{
if(obj->ans[obj->ptr] != 0)
{
res[(*retSize)++] = obj->str[obj->ptr];
}
else
break;
}
return res;
}
return NULL;
}
void orderedStreamFree(OrderedStream* obj) {
free(obj->ans);
free(obj->str);
free(obj);
}
/**
* Your OrderedStream struct will be instantiated and called as such:
* OrderedStream* obj = orderedStreamCreate(n);
* char ** param_1 = orderedStreamInsert(obj, idKey, value, retSize);
* orderedStreamFree(obj);
*/
作者:xun-ge-v
链接:https://leetcode.cn/problems/design-an-ordered-stream/solution/jian-dan-mo-ni-by-xun-ge-v-d8sm/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。