返回目录
题目描述
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。
输入描述
一个数组
输出描述
去重排序后的数组
输入 | 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(); // 返回最终结果字符串
}
}
4 条评论
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]