• c语言刷 设计题合计


    355. 设计推特

    #define MAX_LEN 512
    
    struct User {
        int userId;
        int followee[MAX_LEN]; // 散列表,0/1,1表示这个user被关注
        struct User *next;
    };
    
    struct Tweet {
        int userId;
        int tweetId;
        struct Tweet *next;
    };
    
    typedef struct {
        struct User *user;
        struct Tweet *tweet
    } Twitter;
    
    
    Twitter* twitterCreate() 
    {
        Twitter* obj = (Twitter*)malloc(sizeof(Twitter));
        obj->user = (struct User*)malloc(sizeof(struct User));
        obj->tweet = (struct Tweet*)malloc(sizeof(struct Tweet));
        obj->user->next = NULL;
        memset(obj->user->followee, 0, sizeof(int) * MAX_LEN);
        obj->tweet->next = NULL;
        return obj;
    }
    
    /*
    * 注意:
    * 这里只给推文这个结构体增加了userId,但是没有给用户这个结构体加,
    * 所以后续用户这个结构体可能会得到user是NULL,但是不能返回空
    */
    void twitterPostTweet(Twitter* obj, int userId, int tweetId) 
    {
        struct Tweet *node = (struct Tweet *)malloc(sizeof(struct Tweet));
        node->userId = userId;
        node->tweetId = tweetId;
        // 头插法
        node->next = obj->tweet->next;
        obj->tweet->next = node;
    }
    
    int* twitterGetNewsFeed(Twitter* obj, int userId, int* retSize) 
    {
        struct User *user = obj->user->next;
        struct Tweet *tweet = obj->tweet->next;
        int *res = (int *)malloc(sizeof(int) * 10);
        *retSize = 0;
        while (user != NULL && user->userId != userId) {
            user = user->next;
        }
        if (user == NULL) {
            // 还是要遍历推文结构体
            while (tweet != NULL && (*retSize < 10)) {
                if (tweet->userId == userId) {
                    res[(*retSize)++] = tweet->tweetId;
                }
                tweet = tweet->next;
            }
            return res;
        }
        
        while (tweet != NULL && (*retSize < 10)) {
            if (tweet->userId == userId || user->followee[tweet->userId] == 1) {
                res[(*retSize)++] = tweet->tweetId;
            }
            tweet = tweet->next;
        }
        return res;
    }
    
    void twitterFollow(Twitter* obj, int followerId, int followeeId) 
    {
        struct User *user = obj->user;
        // 查询用户链表中是否有这个用户节点
        while (user->next != NULL && user->userId != followerId) {
            printf("loop \n");
            user = user->next;
        }
        // 有:设置标志位为1
        if (user->userId == followerId) {
            user->followee[followeeId] = 1;
        } else {
            // 没有:新建一个节点
            struct User *node = (struct User *)malloc(sizeof(struct User));
            node->userId = followerId;
            node->followee[followeeId] = 1;
            node->next = obj->user->next;
            obj->user->next = node;
        }
    }
    
    void twitterUnfollow(Twitter* obj, int followerId, int followeeId) 
    {
        struct User *user = obj->user;
        while (user->next != NULL && user->userId != followerId) {
            user = user->next;
        }
        if (user->userId == followerId) {
            user->followee[followeeId] = 0;
        }
    }
    
    void twitterFree(Twitter* obj) 
    {
        free(obj->user);
        free(obj->tweet);
        free(obj);
    }
    
    /**
     * Your Twitter struct will be instantiated and called as such:
     * Twitter* obj = twitterCreate();
     * twitterPostTweet(obj, userId, tweetId);
     
     * int* param_2 = twitterGetNewsFeed(obj, userId, retSize);
     
     * twitterFollow(obj, followerId, followeeId);
     
     * twitterUnfollow(obj, followerId, followeeId);
     
     * twitterFree(obj);
    */
  • 相关阅读:
    idea 2019 版本的 破解方式
    php-fpm 服务的一些常见配置
    redis通过pipeline提升吞吐量
    redis 简易监控的几种方法
    mongodb查询操作分析
    mongodb监控常用方法
    Linux 系统监控常用命令
    mongodb 认证鉴权那点事
    使用H2数据库进行单元测试
    性能测试-Jmeter3.1 使用技巧
  • 原文地址:https://www.cnblogs.com/kongweisi/p/15687418.html
Copyright © 2020-2023  润新知