华为OD机考双机位C卷 - 商品推荐多属性排序 (Java & Python & JS & GO & C++ & C)

商品推荐多属性排序

2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷

华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

题目描述

双十一来临,小王消灾某个购物平台买坚果。在输入坚果时,页面默认按照综合推荐列表。小王很想知道这个综合排序时如何完成的,于是便开始思考算法 。经过一番操作后,完成它的多个关键字排序算法。希望你给小王提供一份正确的排序结果,验证其实现算法结果的准确性。

输入描述

第一行两个整数n,m(m<=10,n<=100000),分别表示有n个需要排序的商品。每个商品有m个属性。

第二行m个整数(均为1或者-1),每个整数表示第i个属性按照降序(1)或者升序(-1),依次按照属性1-m排序。

接下来n行,每行m个整数,表示每个商品的m个属性。

输出描述

输出排序后的结果

示例1

输入

4 3
1 -1 1
2 2 2
2 3 3
4 4 4
4 4 5

输出

4 4 5
4 4 4
2 2 2
2 3 3

说明

商品评价属性相同时,按照下个属性维度排序。

解题思路

核心思想

本题要求对 $N$ 个商品进行排序,每个商品有 $M$ 个属性。排序规则由第二行给出的 $M$ 个整数决定,表示每个属性的排序方向(1 表示降序,-1 表示升序)。

  1. 自定义比较器
    • 无论是哪种编程语言,核心都是实现一个自定义的比较逻辑。
    • 在比较两个商品 $A$ 和 $B$ 时,依次遍历 $M$ 个属性。
    • 对于第 $i$ 个属性:
      • 如果属性值不同,则根据该属性的排序方向($k_i$)决定谁排在前面。
      • 如果 $k_i = 1$(降序),当 $A_i > B_i$ 时,$A$ 排在前。
      • 如果 $k_i = -1$(升序),当 $A_i < B_i$ 时,$A$ 排在前。
      • 如果属性值相同,则继续比较下一个属性。
  2. 数据结构
    • 存储每个商品的 $M$ 个属性值。可以使用数组或自定义对象。
  3. 排序算法
    • 直接使用语言内置的排序函数(如 Arrays.sort, sort, std::sort),传入自定义比较器即可。

复杂度分析

  • 时间复杂度:$O(N \log N \cdot M)$。排序需要 $O(N \log N)$ 次比较,每次比较最坏需要遍历 $M$ 个属性。
  • 空间复杂度:$O(N \cdot M)$。用于存储所有商品的属性数据。
posted @ 2026-03-09 23:08  华为od算法大师  阅读(1)  评论(0)    收藏  举报