首页 > 试题广场 >

消除重复元素

[编程题]消除重复元素
  • 热度指数:5407 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个。小易遇到了困难,希望你来帮助他。

输入描述:
输入包括两行: 第一行为序列长度n(1 ≤ n ≤ 50) 第二行为n个数sequence[i](1 ≤ sequence[i] ≤ 1000),以空格分隔


输出描述:
输出消除重复元素之后的序列,以空格分隔,行末无空格
示例1

输入

9 100 100 100 99 99 99 100 100 100

输出

99 100
import java.util.*;
/**
 * 此题巧妙地用到了List去重的方法。
 * 比如说有一组数,为1 5 5 1 6 1
 * 从[0,n-1]使用List去重之后,保存地其实就是每种元素最开始出现的那个元素。
 * 但是我们换个角度去想,如果我们从后向前遍历,保存地就是每种元素最后出现的那个元素,只不过相对从前到后来说,数倒过来了。
 * 我们最终将数反转过来即可。
 * 时间复杂度为O(n)
 * @author 何嘉龙
 *
 */
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()) {
			int n = in.nextInt();
			int[] arr = new int[n];
			List<Integer> lists = new ArrayList<>();
			for(int i = 0; i < n; i++) {
				arr[i] = in.nextInt();
			}
			for(int i = n - 1; i >= 0; --i) {
				if(!lists.contains(arr[i])) {
					lists.add(arr[i]);
				}
			}
			for(int i = lists.size() - 1; i >= 0; --i) {
				System.out.print(lists.get(i));
				if(i != 0) {
					System.out.print(" ");
				}
			}
		}
		in.close();
	}
}

发表于 2017-04-15 20:27:55 回复(7)
#include<iostream>
using namespace std;

int main ()
{
	int n;
	cin>>n;
	int seq[50];
	for(int i=0;i<n;i++)
	{
		cin>>seq[i];
	}
	
	for(int i=n-1;i>=0;i--)
	{
		int b=seq[i];
		for(int j=i-1;j>=0;j--)
		{
			if(b-seq[j]==0)
			{
				seq[j]=0;
			}
				
		}
	}
	for(int i=0;i<n;i++)
	{   if(seq[i]!=0)
		{
		cout<<seq[i];
        	if(i<(n-1))
                cout<<' ';
		}
		
	}
}

发表于 2017-03-27 16:14:35 回复(3)
用ArrayList做的,contains方法需要用掉O(n)的时间
建议用HashSet判重把,用空间换时间
package go.jacob.day913;

import java.util.ArrayList;
import java.util.Scanner;

public class Demo3 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] arr=new int[n];
		for(int i=0;i<n;i++){
			arr[i]=sc.nextInt();
		}
		ArrayList<Integer> res=new ArrayList<Integer>();
		for(int i=arr.length-1;i>=0;i--){
			if(!res.contains(arr[i]))
				res.add(arr[i]);
		}
		System.out.print(res.get(res.size()-1));
		for(int i=res.size()-2;i>=0;i--){
			System.out.print(" "+res.get(i));
		}
		sc.close();
	}
} 


发表于 2017-09-13 10:25:39 回复(0)
#include<iostream>
using namespace std;

int all_count=0;
int flag=1;

void compare(int c[50],int d[50],int count,int num)
{	
	if(count==all_count)
	{
		for(int i=(flag-1);i>=0;i--)
		{
			cout<<d[i];
			if(i>0)
				cout<<" ";
		}
		cout<<endl;
		return;
	}
	for(int i=(num-1);i>=0;i--)
	{
		int p=0;
		for(int j=0;j<flag;j++)
		{
			if(c[i]==d[j])
				p=1;
		}
		if(p==0)
			d[flag++]=c[i];
	}
	count++;
	compare(c,d,count,num);
}

int main(void)
{
	int n;
	cin>>n;
	all_count=n;
	int a[50],b[50];
	for(int i=0;i<n;i++)
	{
		int o;
		cin>>o;
		a[i]=o;
	}
	b[0]=a[n-1];
	compare(a,b,1,n);
}

编辑于 2017-03-25 21:43:25 回复(0)
使用一个队列,对于每次输入,判断该数是否已经存在,若存在,删除。然后压入队列。即可
发表于 2017-04-02 22:37:40 回复(0)
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @Author qgfzzzzzz
 * @Date 2019/8/19
 * @Version 1.0
 * <p>
 *
 * </p>
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < arr.length; i++){
            arr[i] = scanner.nextInt();
            map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
        }
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < arr.length; i++){
            if(map.get(arr[i]) == 1) stringBuilder.append(arr[i]).append(" ");
            else{
                int val = map.get(arr[i]);
                map.put(arr[i], val - 1);
            }
        }
        System.out.println(stringBuilder.toString().trim());
    }
}

发表于 2019-08-19 20:28:15 回复(0)
import sys
n=int(sys.stdin.readline().strip())
l=list(map(int,sys.stdin.readline().strip().split()))
l=l[::-1]
result=[]
for i in l:
    if i not in result:
        result.append(i)
result=result[::-1]
result=[str(i) for i in result]
print(' '.join(result))
发表于 2018-05-17 10:23:44 回复(0)
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int main()
{
	//数据输入
	int n;
	cin >> n;
	vector<int> sequence;
	for (int i = 0; i < n; i++)
	{
		int t;
		cin >> t;
		sequence.push_back(t);
	}
	//数据处理,利用set的值唯一特性
	set<int> temp;
	vector<int>result;
	for (int i = sequence.size()-1; i >=0; i--)
		if (temp.find(sequence[i])==temp.end())
		{
			temp.insert(sequence[i]);
			result.push_back(sequence[i]);
		}
	cout << result[result.size() - 1];
	for (int i = result.size() - 2; i >= 0; i--)	cout << " " << result[i];
    return 0;
}  

发表于 2017-04-19 19:57:04 回复(0)
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

/**
*使用一个双端队列即可,比较简单,直接show the code
关键代码就五行
        Deque<Integer> q = new ArrayDeque<>();
        for (int i = n - 1; i >= 0; i --) {
            if (!q.contains(sequence[i])) {
                q.offerFirst(sequence[i]);
            }
        }
*/
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n  = sc.nextInt();
        int[] sequence = new int[n];
        for (int i = 0; i < n; i ++) {
            sequence[i] = sc.nextInt();
        }
        Deque<Integer> q = new ArrayDeque<>();
        for (int i = n - 1; i >= 0; i --) {
            if (!q.contains(sequence[i])) {
                q.offerFirst(sequence[i]);
            }
        }
        int count = q.size();
        for (int i = 0; i < count - 1; i ++) {
            System.out.print(q.poll() + " ");
        }
        System.out.println(q.poll());
    }
}


发表于 2017-04-09 10:36:58 回复(0)
☠头像

### 分析

从后向前先判重后加入即可。


### 我的答案

```cpp

#include<iostream>

#include<string>

#include<algorithm>

#include<set>

#include<vector>

using namespace std;

int main(){

    int n;

    int a[1002]={0};

    vector<int>v;

    set<int>s;

    cin>>n;

    for(int i=0;i<n;i++)

        cin>>a[i];

    for(int i=n-1;i>=0;i--){

        if(s.find(a[i])==s.end()){

            s.insert(a[i]);

            v.push_back(a[i]);

        }

    }

    cout<<v[v.size()-1];

    for(int i=v.size()-2;i>=0;i--){

        cout<<" "<<v[i];

    }

    cout<<endl;


```



编辑于 2017-03-31 13:11:22 回复(0)
# -*- coding: UTF-8 -*-

#倒着读取,已有则不添加,再倒着打印即可。
import sys
n = int(raw_input().strip())
value=map(int,sys.stdin.readline().strip().split())
value.reverse()
i=0
arr=[]
while i<n:
    if value.index(value[i]) == i:
        arr.append(value[i])
    i=i+1
arr.reverse()
for x in arr:
	print x,

发表于 2017-03-28 20:17:47 回复(1)


#include<iostream>

#include<vector>

#include<map>

#include<algorithm>

#include<string>

#include<cmath>
#include<string>
#include<vector>


using namespace std;



int main()
{
    int n, temp;
    cin >> n;
    vector<int> sequence;
    vector<int> save;
    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        sequence.push_back(temp);
    }
    for (int i = 0; i < n - 1; i++)
    {   
        int tmp = 0;
        for (int j = i + 1; j < n; j++)
        {   
            
            if (sequence[i] == sequence[j])
            {
                tmp = 1;
                break;
            }
            else continue;
             
        }
        if (tmp == 0) save.push_back(sequence[i]);
        else if(tmp==1) continue;
    }
    for (auto iter = save.begin(); iter != save.end() ; iter++)
        cout << *iter << ' ';
    cout << *(sequence.end()-1)<<endl;
    return 0;
     
}
发表于 2019-07-17 10:57:22 回复(0)

import java.util.*;

/*
 * 此题需要考虑从后往前遍历,可以使用map结构,针对不存在的情况才进行添加
 * */
public class RemoveDuplicateLast {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int[] nums = new int[n];
            Map<Integer, Integer> map = new HashMap<>();
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                nums[i] = scanner.nextInt();
            }
            int index = 0;
            for (int i = n - 1; i >= 0; i--) {
//                不出现的情况才添加进来
                if (!map.containsKey(nums[i])) {
                    map.put(nums[i], 1);
                    list.add(nums[i]);
                    index++;
                }
            }
            System.out.print(list.get(index - 1));
            for (int i = index - 2; i >= 0; i--) {
                System.out.print(" " + list.get(i));
            }
            System.out.println();
        }
    }
}
发表于 2018-04-11 20:35:21 回复(0)
 var n=readline();
var arr=readline().split(" ");
var b=[];
  b.push(arr[arr.length-1]);
  for(var i=arr.length-2;i>=0;i--){
    b.push(arr[i]);
    for(var j=0;j<b.length-1;j++){
      if(b[j]==b[b.length-1]){
        b.pop()
      }
    }
  }
  console.log(b.reverse().join(" "))
发表于 2018-03-27 11:09:12 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] input = new int[n];
        for(int i = 0; i < n; i++)
            input[i] = sc.nextInt();
        int curP = n;
        Set<Integer> set = new HashSet<>();
        for(int i = n-1; i >= 0; i--) {
            if(set.add(input[i]))
                input[--curP] = input[i];
        }
        System.out.print(input[curP++]);
        for(; curP < n; )
            System.out.print(" " + input[curP++]);
        System.out.println();
    }
}

发表于 2018-03-13 22:59:21 回复(0)
//对于array[i]使用倒叙list.contains()方法去重
//再反向输出list

import java.nio.charset.MalformedInputException;
import java.security.KeyStore.Entry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.Vector;

import javax.xml.transform.Templates;

public class Main{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
        9
        100 100 100 99 99 99 100 100 100
        */
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int [] array = new int [n];
        
        List<Integer> list = new ArrayList<>();
        
        for(int i = 0;i < n;i++){
            array[i] = scanner.nextInt();
            
        }
        
        for(int i = n-1;i >= 0;i--){
            if(list.contains(array[i]) == false){
                list.add(array[i]);
            }
        }
        System.out.print(list.get(list.size()-1));
        for(int i = list.size() - 2;i >= 0;i--){
            System.out.print(" " + list.get(i));
        }
        
        
    }

}

发表于 2018-03-01 18:08:47 回复(0)
Console.WriteLine("请输入一组元素,元素之间用空格隔开");
            string s=Console.ReadLine();
            int[] a = new int[50];
            string[] ss = s.Split(' ');
            int L = ss.Length;
            for (int i = 0; i < ss.Length; i++)
                a[i] = Convert.ToInt32(ss[i]);
            for (int i=L;i>=0;i--)
            {
                int c = a[i];
                for (int j =i-1;j>=0; j--)
                {
                    if (c - a[j]== 0)
                        a[j] = 0;
                }
            }
            for (int j = 0; j < L; j++)
                if(a[j]!=0)
                Console.Write(a[j]+"   ");
            Console.ReadKey();

发表于 2017-10-25 19:06:20 回复(0)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        List<String> list=new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String num=sc.next();
            if(list.contains(num)) list.remove(num);
            list.add(num);
        }
        for (int i=0;i<list.size();i++) {
            if(i!=list.size()-1){
                System.out.print(list.get(i)+" ");
            }else{
                System.out.println(list.get(i));
            }
        }
    }
}
编辑于 2017-10-15 12:11:34 回复(0)

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        int length=sc.nextInt();
        String[] nums=new String[length];
        for(int i=0;i<length;i++) {
            nums[i]=String.valueOf(sc.nextInt());
        }
        LinkedHashSet<String> lhs=new LinkedHashSet<>();
        StringBuilder s=new StringBuilder("");
        for(int i=length-1;i>=0;i--) {
            lhs.add(nums[i]+" ");
        }
        Iterator<String> i=lhs.iterator();
        while(i.hasNext()) {
            s.insert(0,i.next());
        }
        System.out.println(s.toString().trim());
        
    }

}
 
发表于 2017-09-16 22:31:07 回复(0)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<unordered_map>
using namespace std;

void reomveOverLapStrs(const int* array, int n){
    unordered_map<int,int> map_;
    for(int ii=0;ii<n;ii++){
        map_[array[ii]]=ii;
    }
    for(int ii=0;ii<n;ii++){
        int index=map_[array[ii]];
        if(index==ii){
            if(ii==n-1)
                printf("%d\n",array[ii]);
            else
                printf("%d ",array[ii]);
        }
    }
}

int main(){
    int n=0;
    scanf("%d",&n);
    if(n<0 ||n>50)
        return -1;
    int *array=new int[n];
    for(int i=0;i<n;i++){
        scanf("%d",array+i);
        if(array[i]<0 || array[i]>1000)
            return -1;
    }
    
    reomveOverLapStrs(array, n);
    
    delete []array;
    return 0;
}

发表于 2017-09-08 16:20:26 回复(0)