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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值