推荐结果打散

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

题目描述

 输入描述:
   第一行输入为一个整数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;
    }
  • 测试结果
    在这里插入图片描述
<think>嗯,用户询问的是ADS版图如何打散的问题。根据用户提供的参考引用[^1],里面提到了删除版图连接线的方法,但用户真正想了解的是打散操作。用户可能是电子工程师或PCB设计人员,正在处理版图编辑工作。 在ADS环境中,"打散"通常指分解组合对象。用户可能遇到了需要修改已组合的版图元素的情况,比如需要单独编辑某个多边形或走线。这个需求在版图后期调整时很常见。 我考虑从几个方面解答:首先明确打散操作的核心场景是分解组合对象,然后提供具体操作步骤。由于不同版本ADS界面可能有差异,需要同时给出菜单路径和快捷键两种方式。还要提醒用户打散后的注意事项,比如原组合属性会消失。 参考引用[^1]提到的版图标识大小调整其实和打散操作是有关联的,因为打散后经常需要调整单个元素。但用户当前焦点明确在打散操作,不必过多展开其他内容。 最后需要生成相关问题来延伸学习路径,比如打散与解锁的区别、高级编辑技巧等。这些问题应该围绕用户可能的后续需求设计,比如打散后如何重组、遇到无法打散的情况怎么办等。 用户没有说明具体ADS版本,所以回答要兼顾经典界面和现代版本。操作描述要具体但避免绝对化,比如用"通常位于"而不是"一定在"这样的表述。</think>在ADS(Advanced Design System)中进行版图打散操作,通常指**分解组合对象(如多边形、路径等)**,使其恢复为可独立编辑的原始元素。以下是具体操作步骤: --- ### **ADS版图打散方法** 1. **选中目标对象** 在版图编辑窗口(Layout)中,单击选中需要打散的组合对象(如合并后的多边形、群组等)。 2. **执行打散命令** - **菜单路径**: `Edit → Decompose`(或 `Ungroup`,取决于对象类型)[^1]。 - **快捷键**: 部分版本支持 `Ctrl + Shift + G`(取消组合)或 `Ctrl + D`(分解)。 3. **验证结果** 打散后,原组合对象会拆分为独立元素(如多个多边形或线段),可单独选中并编辑顶点(如图2.4所示的分步操作)[^1]。 --- ### **关键注意事项** 1. **打散与删除的区别** - **打散**:仅分解组合关系,**保留所有子元素**。 - **删除**:移除整个对象(需按 `Delete` 键)。 > 若需删除全部版图,需执行 `Edit → Delete All` 并重新保存原理图[^1]。 2. **标识大小调整** 打散后若标识(如标签、尺寸标注)过大,需手动调整: - 选中标识 → 右键 `Properties` → 修改字体/大小(参考图2.4)[^1]。 3. **版图与原理图同步** 打散操作仅影响当前版图文件。若需同步到原理图,建议: - 删除旧版图 → 保存原理图 → 重新生成新版图(避免标识冲突)[^1]。 --- ### **操作示例** ```plaintext [版图编辑界面] 1. 选择组合对象(如矩形阵列) 2. 点击菜单 Edit → Decompose 3. 对象分解为独立矩形 → 可拖动/修改单个矩形 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值