返回目录

题目描述

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

输入描述

一个数组

输出描述

去重排序后的数组

输入1,3,3,3,2,4,4,4,5
输出3,4,1,2,5
说明数组大小不超过100 数组元素值大小不超过100。

题目解析

简单的排序问题。

Python算法源码

def get_result(arr):
    count = {}   # 创建用于统计元素出现次数的字典
    first = {}   # 创建记录元素首次出现位置的字典

    # 遍历输入数组
    for i, s in enumerate(arr):
        count[s] = count.get(s, 0) + 1  # 更新元素出现次数
        if s not in first:  # 若元素首次出现,记录其位置
            first[s] = i

    # 根据规则排序元素
    sorted_keys = sorted(first.keys(), key=lambda x: (-count[x], first[x]))
    result = ','.join(sorted_keys)  # 构建结果字符串

    return result

arr = input().split(',')   # 从输入获取数组
print(get_result(arr))     # 输出结果

C语言算法源码

#include <stdio.h>
#include <string.h>

// 定义结构体来存储字符串和对应的出现次数和首次出现位置
struct Element {
    char str[100];
    int count;
    int firstIndex;
};

void getResult(char* arr[], int arrSize) {
    struct Element elements[1000]; // 假设最多有1000个不同的字符串
    int numElements = 0;

    // 遍历输入的数组
    for (int i = 0; i < arrSize; i++) {
        int found = 0;
        // 查找当前字符串是否已经存在于结构体数组中
        for (int j = 0; j < numElements; j++) {
            if (strcmp(elements[j].str, arr[i]) == 0) {
                elements[j].count++; // 存在,更新出现次数
                found = 1;
                break;
            }
        }
        if (found == 0) {
            // 不存在,添加新的结构体记录并更新首次出现位置
            strcpy(elements[numElements].str, arr[i]);
            elements[numElements].count = 1;
            elements[numElements].firstIndex = i;
            numElements++;
        }
    }

    // 对结构体数组进行排序
    for (int i = 0; i < numElements - 1; i++) {
        for (int j = 0; j < numElements - i - 1; j++) {
            if (elements[j].count < elements[j + 1].count ||
                (elements[j].count == elements[j + 1].count && elements[j].firstIndex > elements[j + 1].firstIndex)) {
                struct Element temp = elements[j];
                elements[j] = elements[j + 1];
                elements[j + 1] = temp;
            }
        }
    }

    // 输出结果
    for (int i = 0; i < numElements; i++) {
        printf("%s", elements[i].str);
        if (i != numElements - 1) {
            printf(",");
        }
    }
}

int main() {
    char input[1000];
    fgets(input, sizeof(input), stdin);
    input[strcspn(input, "\n")] = 0; // 移除换行符

    // 分割输入字符串
    char* arr[1000];
    char* token = strtok(input, ",");
    int arrSize = 0;
    while (token != NULL) {
        arr[arrSize++] = token;
        token = strtok(NULL, ",");
    }

    getResult(arr, arrSize); // 调用函数输出结果

    return 0;
}

Java算法源码

import java.util.HashMap;
import java.util.Scanner;
import java.util.StringJoiner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] arr = sc.nextLine().split(","); // 从控制台输入获取字符串数组
        System.out.println(getResult(arr)); // 输出调用getResult函数的结果
    }

    public static String getResult(String[] arr) {
        HashMap<String, Integer> count = new HashMap<>(); // 用于记录元素出现次数的 HashMap
        HashMap<String, Integer> first = new HashMap<>(); // 用于记录元素首次出现位置的 HashMap

        // 遍历输入的数组
        for (int i = 0; i < arr.length; i++) {
            String s = arr[i];
            count.put(s, count.getOrDefault(s, 0) + 1); // 更新元素出现次数
            first.putIfAbsent(s, i); // 记录元素首次出现的位置
        }

        StringJoiner sj = new StringJoiner(","); // 用于构建输出字符串

        // 对首次出现位置和出现次数进行排序
        first.keySet().stream()
            .sorted((a, b) -> {
                int countA = count.get(a);
                int countB = count.get(b);

                if (countA != countB) {
                    return countB - countA; // 按出现次数降序排序
                } else {
                    int firstA = first.get(a);
                    int firstB = first.get(b);
                    return firstA - firstB; // 若出现次数相同,按首次出现位置升序排序
                }
            })
            .forEach(s -> sj.add(s)); // 构建排序后的字符串序列

        return sj.toString(); // 返回最终结果字符串
    }
}
最后修改:2024 年 04 月 02 日
如果觉得我的文章对你有用,请随意赞赏