数组去重和排序 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

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

输入描述

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

输出描述

去重排序后的数组

示例1

输入:
1,3,3,2,4,4,4,5

输出:
4,3,1,2,5

题解

解题思路:

  1. 创建一个 NumInfo 用于存储数字、数字出现次数和第一次出现的位置。
  2. 初始化一个数组 nums,其中每个元素是一个 NumInfo 对象,表示数字的信息。
  3. 读入数组并遍历,统计每个数字的出现次数和第一次出现的位置。
  4. 使用排序函数对 nums 数组进行排序,按照出现次数从高到低排序,相同出现次数按照第一次出现的位置排序。
  5. 输出排序后的结果。

Java

import java.util.Arrays;
import java.util.Scanner;

class NumInfo {
    int val;        // 数字
    int cnt;        // 出现次数
    int first_index;// 第一次出现的位置

    NumInfo(int val) {
        this.val = val;
    }
}
/**
 * @author code5bug
 */
public class Main {

    static final int N = 105;

    public static void main(String[] args) {
        NumInfo[] nums = new NumInfo[N];

        for (int i = 0; i < N; i++) {
            nums[i] = new NumInfo(i);
        }

        Scanner in = new Scanner(System.in);
        int[] arr = Arrays.stream(in.nextLine().split(","))
                .mapToInt(Integer::parseInt).toArray();

        for (int i = 0; i < arr.length; i++) {
            int t = arr[i];

            // 记录数字出现次数和第一次出现的位置
            if (++nums[t].cnt == 1) {
                nums[t].first_index = i;
            }
        }


        // 根据次数和第一次出现的顺序排序
        Arrays.sort(nums, (a, b) -> {
            if (a.cnt != b.cnt) {
                return Integer.compare(b.cnt, a.cnt);
            } else {
                return Integer.compare(a.first_index, b.first_index);
            }
        });

        // 输出结果
        for (int i = 0; i < N; i++) {
            if (i + 1 < N && nums[i + 1].cnt == 0) {
                System.out.println(nums[i].val);
                break;
            } else {
                System.out.print(nums[i].val + ",");
            }
        }
    }
}


Python

class NumInfo:
    def __init__(self, val):
        self.val = val        # 数字
        self.cnt = 0          # 出现次数
        self.first_index = 0  # 第一次出现的位置


def main():
    N = 105

    # 初始化 NumInfo 对象数组
    nums = [NumInfo(i) for i in range(N)]

    arr = list(map(int, input().split(',')))
    for idx in range(len(arr)):
        t = arr[idx]
        # 记录数字出现次数和第一次出现的位置
        nums[t].cnt += 1
        if nums[t].cnt == 1:
            nums[t].first_index = idx

    # 根据次数和第一次出现的顺序排序
    nums.sort(key=lambda x: (-x.cnt, x.first_index))

    result = [str(num.val) for num in nums if num.cnt > 0]
    print(",".join(result))


if __name__ == "__main__":
    main()

C++

#include <bits/stdc++.h>
#define N 105

using namespace std;

struct{
    int val;        // 数字
    int cnt;        // 出现次数
    int first_index;// 第一次出现的位置
} nums[N];

int main(){
    for(int i=0;i<N;i++) nums[i].val = i;

    for(int i=0, t; cin >> t; i++){
        if(cin.peek() == ',') cin.ignore();

        if(++nums[t].cnt == 1){ // 记录第一次出现的位置
            nums[t].first_index = i;
        }
    }

    // 根据次数和第一次出现的顺序排序
    sort(nums, nums + N, [](const auto &a, const auto &b){
        return a.cnt > b.cnt || (a.cnt == b.cnt && a.first_index < b.first_index);
    });

    for(int i=0;i<N;i++){
        if(nums[i+1].cnt == 0){
            cout << nums[i].val <<  endl;
        }else{
            cout << nums[i].val << ",";
        }
    }

    return 0;
}   

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##华为##春招##秋招##校招#
全部评论

相关推荐

07-02 10:39
门头沟学院 Java
Steven267:说点真实的,都要秋招了,还没有实习,早干嘛去了,本来学历就差,现在知道急了,而且你这个简历完全可以写成一页,劣势太大了,建议转测试
点赞 评论 收藏
分享
07-16 14:10
门头沟学院 Java
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务