• 求圈子用户数_2.0_2


    //A以电影直接或间接关注的所有用户,A是follower,即A关注的
    void followingUsers(unsigned int follower_id, unsigned int hobby_id)
    {
        vector<FollowRelation>::iterator iterTemp = tempFrVec.begin();
        for(; iterTemp != tempFrVec.end(); iterTemp++)
        {
            if(iterTemp->followerId == follower_id && iterTemp->hobbyId == hobby_id && iterTemp->traverseFlag == INIT)
            {
                iterTemp->traverseFlag = IS_TRAVERSE;    
                //followingSet.insert(iterTemp->userId);
                circleSet.insert(iterTemp->userId);
                circleSet.insert(iterTemp->followerId);
                followingUsers(iterTemp->userId, hobby_id);//迭代,直到所有直接的和间接的全部遍历完
            }
        }    
    }
    
    //以电影直接或间接关注A的所有用户,A是user,即关注A的
    void followedUsers(unsigned int user_id, unsigned int hobby_id)
    {
        vector<FollowRelation>::iterator iterTemp = tempFrVec.begin();
        for(; iterTemp != tempFrVec.end(); iterTemp++)
        {
            if(iterTemp->userId == user_id && iterTemp->hobbyId == hobby_id && iterTemp->traverseFlag == INIT)
            {
                iterTemp->traverseFlag = IS_TRAVERSE;    
                //followedSet.insert(iterTemp->followerId);    
                circleSet.insert(iterTemp->followerId);
                circleSet.insert(iterTemp->userId);
                followedUsers(iterTemp->followerId, hobby_id);
            }
        }
    }
    
    /******************************************************************************
    功能:      计算指定(用户,爱好)的圈子的用户数量
    输入参数:
        user_id :  指定用户
        hobby_id:  指定爱好
    返回值:
        成功,返回该圈子的用户数量。
        失败,返回0。
    *******************************************************************************/
    unsigned int CalcUserNum(unsigned int user_id, unsigned int hobby_id)
    {
        //判断指定的用户是否有指定的爱好
        if(isExistCheck(user_id,hobby_id) == -1)
        {
            return 0;
        }
    
        //每次计算之前清空set
        if(!circleSet.empty())
        {
            circleSet.clear();
        }
            
        circleSet.insert(user_id);//圈子数包括自身
    
        //处理关注圈和被关注圈的用户数量
        if(!tempFrVec.empty())
        {
            tempFrVec.clear();
        }
        tempFrVec = followRelationVec;
        followingUsers(user_id, hobby_id);
    
        if(!tempFrVec.empty())
        {
            tempFrVec.clear();
        }
        tempFrVec = followRelationVec;
        followedUsers(user_id, hobby_id);
        
        return circleSet.size();
    }
    
    /******************************************************************************
    功能:清空所有数据
    输入:无
    输出:无  
    返回:无
    *******************************************************************************/
    void Clear(void)
    {
        if(!followRelationVec.empty())
        {
            followRelationVec.clear();
        }    
    
        if(!userHobbysMap.empty())
        {
            userHobbysMap.clear();
        }
        
        if(!circleSet.empty())
        {
            circleSet.clear();
        }
    
        if(!tempFrVec.empty())
        {
            tempFrVec.clear();
        }
    
        return;
    }

    后记,标题说是2.0,其实都写了好多次了,估计都有2.7、2.8了,oj系统上也提交了有10次。
    好在最后10个用例终于全部pass。此题关键是迭代抽象的要好,标记变量设计的漂亮,然后关注链和被关注链要分别迭代。

  • 相关阅读:
    docker相关
    多线程
    设计模式
    ftp下载乱码问题
    Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止
    Struts2 if标签
    Java项目编译时经常会出现不编译,或者报一些假性错误
    ajaxSubmit 上传文件 提示下载json处理
    MySQL中优化sql语句查询常用的30种方法
    mybatis 中的where标签
  • 原文地址:https://www.cnblogs.com/liuzc/p/6552587.html
Copyright © 2020-2023  润新知