zl程序教程

您现在的位置是:首页 >  其他

当前栏目

LeetCode·每日一题·1656.设计有序流·模拟

LeetCode模拟 设计 每日 有序
2023-09-27 14:26:29 时间

链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。