【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【排序】2023C-数组去重和排序【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 补充说明
    • 示例
      • 输入
      • 输出
  • 解题思路
  • 代码
    • Python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目描述与示例

题目描述

给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。

输入描述

一个数组

输出描述

去重排序后的数组

补充说明

数组大小不超过100,数组元素值大小不超过100

示例

输入

1,3,3,3,2,4,4,4,5

输出

3,4,1,2,5

解题思路

很简单、直接的排序模拟题。

去重和计数、记录第一次出现的下标,直接使用哈希表来完成即可。

代码

Python

# 题目:【排序】2023C-数组去重和排序
# 分值:100
# 作者:闭着眼睛学数理化
# 算法:排序/哈希
# 代码看不懂的地方,请直接在群上提问


from collections import Counter

# 输入数组
nums = list(map(int, input().split(",")))
# 使用哈希表统计每一个元素出现频率
cnt = Counter(nums)
# 使用哈希表记录每一个元素第一次出现的下标
dic = dict()
# 遍历原数组中的每一个元素以及其下标
for i, num in enumerate(nums):
    # 如果未存在于哈希表dic中,则记录第一次出现的下标
    if num not in dic:
        dic[num] = i
# 获得所有的键,即所有元素
ans = list(cnt.keys())
# 现根据出现次数cnt[x]降序排序,再根据第一次出现的下标升序排序
ans.sort(key = lambda x: (-cnt[x], dic[x]))
# 输出答案
print(",".join(str(x) for x in ans))

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] numsString = scanner.nextLine().split(",");
        int[] nums = new int[numsString.length];
        
        for (int i = 0; i < numsString.length; i++) {
            nums[i] = Integer.parseInt(numsString[i]);
        }
        
        Map<Integer, Integer> countMap = new HashMap<>();
        Map<Integer, Integer> firstIdxMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (!firstIdxMap.containsKey(nums[i])) {
                firstIdxMap.put(nums[i], i);
            }
            countMap.put(nums[i], countMap.getOrDefault(nums[i], 0) + 1);
        }
        
        List<Integer> uniqueNums = new ArrayList<>(countMap.keySet());
        Collections.sort(uniqueNums, (a, b) -> {
            if (countMap.get(a).equals(countMap.get(b))) {
                return firstIdxMap.get(a) - firstIdxMap.get(b);
            } else {
                return countMap.get(b) - countMap.get(a);
            }
        });
        
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < uniqueNums.size(); i++) {
            result.append(uniqueNums.get(i));
            if (i != uniqueNums.size() - 1) {
                result.append(",");
            }
        }
        
        System.out.println(result);
    }
}

C++

#include 
#include 
#include 
#include 

int main() {
    std::string input;
    std::getline(std::cin, input);
    std::vector<int> nums;
    size_t pos = 0, found;
    while ((found = input.find(',', pos)) != std::string::npos) {
        nums.push_back(std::stoi(input.substr(pos, found - pos)));
        pos = found + 1;
    }
    nums.push_back(std::stoi(input.substr(pos)));

    std::unordered_map<int, int> countMap;
    std::unordered_map<int, int> firstIdxMap;
    for (int i = 0; i < nums.size(); ++i) {
        if (firstIdxMap.find(nums[i]) == firstIdxMap.end()) {
            firstIdxMap[nums[i]] = i;
            countMap[nums[i]] = 1;
        } else {
            countMap[nums[i]]++;
        }
    }

    std::sort(nums.begin(), nums.end(), [&](int a, int b) {
        if (countMap[a] == countMap[b]) {
            return firstIdxMap[a] < firstIdxMap[b];
        } else {
            return countMap[a] > countMap[b];
        }
    });

    nums.erase(std::unique(nums.begin(), nums.end()), nums.end());

    for (size_t i = 0; i < nums.size(); ++i) {
        std::cout << nums[i];
        if (i != nums.size() - 1) {
            std::cout << ",";
        }
    }

    return 0;
}

时空复杂度

时间复杂度:O(NlogN)。排序所需时间复杂度

空间复杂度:O(N)。两个哈希表所占空间


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

你可能感兴趣的:(最新华为OD真题,#,模拟,#,哈希表,算法,java,c++,python,leetcode,华为od)