输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。
输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。
5 10 12 93 12 75
10 12 93 75
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
Set<String> set = new LinkedHashSet<>();
for (int i = 0; i < n; i++) {
set.add(Integer.toString(sc.nextInt()));
}
String res = set.stream().collect(Collectors.joining(" "));
System.out.println(res);
}
}
} #include <iostream>
using namespace std;
int main()
{
int a[1000],b[5000]={0},n;//b为标记数组
cin>>n;
for(int i=0;i<n;++i)
cin>>a[i];
for(int i=0;i<n;++i)
if(b[a[i]]==0)//没有出现过
{
cout<<a[i]<<" ";
b[a[i]]=1;//标记已输出
}
return 0;
} #include<bits/stdc++.h>
using namespace std;
int main()
{
int len,arr_num,flag_same = 0;
cin>>len;
int arr[len];
for(int i = 0;i<len;i++){
cin>>arr_num;
arr[i] = arr_num;
}
for(int j = 0;j<len;j++){
for(int k = 0;k<j;k++){
if(arr[j] == arr[k]){
flag_same = 1;
break;
}
}
if(flag_same == 1){
//注意标识 要还原为0
flag_same = 0;
continue;
}
cout<<arr[j]<<" ";
}
} #include<stdio.h>
int main()
{
int n = 0,arr[1000] = {0},count = 0;
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&arr[i]);
int i = 0,j = 0,k = 0;
for(i = 0;i < n;i++)
{
for(j = i + 1;j < n;j++)
{
if(arr[i] == arr[j])
{
for(k = j;k < n - 1;k++)
arr[k] = arr[k + 1];
arr[k] = '\0';
n--,j--;
}
}
printf("%d ",arr[i]);
}
return 0;
} #include <stdio.h>
int main(){
int n;
scanf("%d", &n);
int a[n];
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
if(a[i] == a[j]){
for(int k = j; k < n; k++)
a[k] = a[k+1];
n--;
j--;
}
}
}
for(int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
} #include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int arr[1000];
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
int j;
for(j=0;j<i;j++)
{
if(arr[j]==arr[i])
{
break;
}
}
if(j==i)
{
printf("%d ",arr[i]);
}
}
}
#include <stdio.h>
//下面的法一,会将该输入进行递增排序后输出,不会保留输入的顺序,还是需要重新优化的,看法二
/*
int main()
{
int n = 0;
int arr[5001] = {0};
int i = 0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
//进行整数的存储
int tmp = 0;
scanf("%d",&tmp);
if( arr[tmp] == 0 )
arr[tmp]=1;
}
for(i=0; i<5001; i++)
{
if(arr[i] == 1)
printf("%d ",i);
}
return 0;
}
*/
//法二:此方法可能复杂度会过大,如要进一步优化,则可以参考方法三使用两个数组,在输入的时候便和输出数组进行对比!
/*
int main()
{
int n = 0;
int arr[1000];//用于存储元素
scanf("%d",&n);
int i = 0;
//输入
for(i=0; i<n; i++)
{
scanf("%d",&arr[i]);
}
//去重
for(i=0; i<n; i++)
{
//判断下标为i的元素 arr[i] 是否在后面位置出现
int j = 0;
for(j=i+1; j<n; j++)
{
if(arr[i] == arr[j])
{
//去重
//将j+1的位置的元素全部向前移动一位!
int k = 0;
for(k=j; k<n-1; k++)//将k的范围最大固定到n-1,防止其越界访问
{
arr[k]=arr[k+1];
}
n--;
j--;//为了避免j跳过元素,需要--
}
}
}
//输出
for(i=0; i<n; i++)
{
printf("%d ",arr[i]);
}
return 0;
}*/
//法三
int main()
{
int n;
//第一行包含一个正整数n(1 ≤ n ≤ 1000)
int arr1[1000]={0}; //作为输入数组存储信息
int arr2[1000]={0}; //作为输出数组用于筛选去重后的数字
scanf("%d",&n);
int num=0;//用于统计去重后元素的个数
for(int i=0;i<n;i++){
int sum=0;//用于表示该元素是否为重复元素
scanf("%d ",&arr1[i]);//输入数组①
for(int j=0;j<i;j++){
if(arr2[j]==arr1[i]){ //检测输出数组②中是否已经存在此数
sum=1;
break;
}
}
//sum=0说明if循环未进入则输出数组中无此数
//将满足的值输入二数组
if(sum==0)
{ //说明此时为非重复元素
arr2[num]=arr1[i];//将该元素存储到arr2输出数组中
num++;//个数++
}
}
for(int i=0;i<num;i++){ //输出去重后的数组
printf("%d ",arr2[i]);
}
return 0;
}
#include<iostream>
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i!=j&&a[i]==a[j]){
a[j]=0;
}
}
}
for(int i=0;i<n;i++){
if(a[i]!=0){
printf("%d ",a[i]);
}
}
return 0;
} #include <bits/stdc++.h>
#include<map>
using namespace std;
int main(){
int n,k=0;
int data;
vector<int> a;
cin>> n;
cin.ignore();
if(n>0 && n<1001)
for(int i=0;i<n;i++){
cin>>data;
auto e = find(a.begin(),a.end(),data);
if(e==a.end())
a.push_back(data);
}
for(auto j:a){
cout<<j<<" ";
}
return 0;
} #include<stdio.h>
int main() {
int n,i,j,p=0,flag=1;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
for(j=0;j<i;j++){
if(a[i]==a[j]){
flag=0;
break; //此处为continue或者break甚至两者都不写,都是可以的,因为这个for里面,没有使flag再=1的语句
}
}
if(flag)
printf("%d ",a[i]);
flag=1;
}
return 0;
}
不另构数组,直接输出,利用输入输出特性
#include <stdio.h>
int main(){
int n, x, arr[30];
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%d", &arr[i]);
for(int i = 0; i < n; i++){
int count = 0;
for(int j = 0; j <= i; j++){ //查询(0, i)之间当前元素出现次数
if(arr[i] == arr[j])
count++;
}
if(count == 1) //大于1说明重复
printf("%d ", arr[i]);
}
return 0;
}