作者 : Xia Xinyu
日期 : 2021-08-14
原题链接
题目 :给定一个长度为 n 的整数数组 a1,a2,…,an。
现在要进行数组去重。
对于数值相同的元素,只保留位于数组最右边的那个。
去重完成后,剩余所有元素的相对位置应保持不变。
输出去重后的数组。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出占两行,第一行输出去重后的数组长度,第二行输出去重后的数组。
整数之间单个空格隔开。
数据范围
前三个测试点满足 1≤n≤6。
所有测试点满足 1≤T≤20,1≤n≤50,1≤ai≤1000。
输入样例1:
1
6
1 5 5 1 6 1
输出样例1:
3
5 6 1
输入样例2:
1
5
2 4 2 4 4
输出样例2:
2
2 4
输入样例3:
1
5
6 6 6 6 6
输出样例3:
1
6
思路1:暴力循环,若在遍历过程发现两个值相同,则将数组左边的值设为-1,最后统计数组中不为-1的值再输出即可
代码1:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T-- != 0){
int n = in.nextInt();
var a = new int[n];
for(int i = 0;i < n;i++) a[i] = in.nextInt();
for(int i = 0;i < n - 1;i++)
for(int j = i + 1;j < n;j++)
{
if(a[i] == a[j]) a[i] = -1;
}
int cnt = 0;
for(int i = 0;i < n;i++)
if(a[i] != -1) cnt++;
System.out.println(cnt);
for(int i = 0;i < n;i++)
if(a[i] != -1) System.out.print(a[i] + " ");
System.out.println();
}
}
}
时间复杂度:O(n^2)
(两层循环)
空间复杂度:O(n)
思路2(优化算法):维护一个flag数组,若数值n出现过将flag[n]标记为true,然后将a[n]中flag为true的值添加进结果数组,最后将结果数组逆序输出即
代码2:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int T = in.nextInt();
while(T-- != 0){
var s = new boolean[1001];
int n = in.nextInt();
var a = new int[n + 1];
int j = n;
var res = new int[n + 1];
for(int i = 1;i <= n;i++)a[i] = in.nextInt();
for(int i = n;i >= 1;i--){
if(!s[a[i]]){
s[a[i]] = true;
res[j--] = a[i];
}
}
System.out.println(n - j);
int len = n - j;
int t = len;
for(int i = n;i > j;i--){
a[t--] = res[i];
}
for(int i = 1;i <= len;i++) System.out.print(a[i] + " ");
System.out.println();
}
}
}