推荐结果打散

该博客主要讨论如何实现一个推荐结果的处理算法,确保在每N个结果中最多有一个图片。输入包括N和M,分别代表每N个结果允许一个图片,以及M个待处理的推荐结果。算法首先将结果按视频和图片分离,然后按照特定规则进行打散,以确保图片分布符合限制。该算法在Java中实现,适用于推荐系统和内容过滤场景。
摘要由CSDN通过智能技术生成

题目描述

 输入描述:
   第一行输入为一个整数N(1~10),表示每N个结果里最多出一个图片结果
   第二行输入为一个整数M(1~100),表示有M个待处理的推荐结果
   第三行~第2+M行为具体的 M 个待处理结果,每行具体为:字符串 V_  或  P_ 打头,后面接输入时0~M-1的顺序标号
 输入描述:
   第1行为K,表示打散处理后结果的长度
   第2~K+1行为打散后的结果,具体为:字符串  V_ 或  P_  打头,后面接输入时 0~M-1 的顺序标号

List<String> param = new ArrayList<>();
param.add("V_0");
param.add("V_1");
param.add("V_2");
param.add("P_3");
param.add("P_4");
param.add("P_5");
param.add("V_6");
param.add("P_7");
param.add("V_8");
param.add("V_9");
如上 M=10   当  N=3 时,
输出应为:V_0 V_1 V_2 P_3 V_6 V_8 P_4 V_9  最终结果 每三个元素中  最多有一个  picture

解题思路-java

    /**
     * 推荐结果打散
     * @param picAndVideo   用 list 代表输入的 M 行数据
     * @param maxInterval   用 maxInterval 代表 N ,表示每 maxInterval 中最多允许一个 图片出现
     * @return              最终打散的结果集
     */
    public List<String> getRecommendResult(List<String> picAndVideo, int maxInterval) {
      	if(picAndVideo == null || picAndVideo.size() == 0) {
          return null;
        }
      	// 首先定义一个结果集
      	List<String> result = new ArrayList<>();
      	// 假如第一个 是  video  那么可以直接添加到结果集中去
      	boolean firstPic = false;
      	int index = 0;
      	while (!firstPic && index <= picAndVideo.size()) {
          if(picAndVideo.get(index).startsWith("V_")) {
            result.add(picAndVideo.get(index));
            index++;
          } else {
            // 遇到了 picture
            firstPic = true;
          }
        }
     		// 此时 处理完毕,若是入参数 中没有一个  picture 直接返回
      	int currentSize = result.size();
      	if(currentSize == picAndVideo.size()) {
          return result;
        }
      	
      	// 分离剩余的结果
      	Queue<String> pic = new LinkedList<>();
      	Queue<String> vid = new LinkedList<>();
      	
      	while(index <= picAndVideo.size()) {
          if(picAndVideo.get(index).startsWith("V_")) {
            vid.add(picAndVideo.get(index));
          } else {
            pic.add(picAndVideo.get(index));
          }
          index++;
        }
      
      	// 分离完毕,开始往结果集中放
      	while(!pic.isEmpty() && !vid.isEmpty()) {
          // 如果当前 currentSize >= maxInterval-1 则满足放入一个 picture 的标准
          if(currentSize >= (maxInterval - 1)) {
            result.add(pic.poll());
            currentSize = 0;
          } else {
            result.add(vid.poll());
            currentSize++;
          }
        }
      
      	// 处理完毕,如果  vid  不为空,全部加入到结果集中去
      	while(!vid.isEmpty()) {
          result.add(vid.poll());
        }
      
        // 如果此时 currentSize >= maxInterval-1 且恰好  pic 不为空
      	if(!pic.isEmpty() && currentSize >= (maxInterval - 1)) {
          result.add(pic.poll());
        }
     		
        return result;
    }
  • 测试结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值