数组去重和排序 - 华为OD统一考试(C卷)
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++
题目描述
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。
输入描述
一个数组,数组大小不超过100 数组元素值大小不超过100
输出描述
去重排序后的数组
示例1
输入:
1,3,3,2,4,4,4,5
输出:
4,3,1,2,5
题解
解题思路:
- 创建一个
NumInfo
用于存储数字、数字出现次数和第一次出现的位置。- 初始化一个数组
nums
,其中每个元素是一个NumInfo
对象,表示数字的信息。- 读入数组并遍历,统计每个数字的出现次数和第一次出现的位置。
- 使用排序函数对
nums
数组进行排序,按照出现次数从高到低排序,相同出现次数按照第一次出现的位置排序。- 输出排序后的结果。
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;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
#面经##华为##春招##秋招##校招#