4、消除重复元素--网易2017春招

[编程题] 消除重复元素
时间限制:1秒
空间限制:32768K
小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个。小易遇到了困难,希望你来帮助他。 
输入描述:
输入包括两行: 第一行为序列长度n(1 ≤ n ≤ 50) 第二行为n个数sequence[i](1 ≤ sequence[i] ≤ 1000),以空格分隔
 
 
输出描述:
输出消除重复元素之后的序列,以空格分隔,行末无空格
 
输入例子:
9 100 100 100 99 99 99 100 100 100
 
输出例子:
99 100
 
解题思路:本题记录最后一个出现的不重复的数,因此想到从后往前遍历,遇到未出现过的就存起来,遇到重复的遍历下一元素。因为是倒着存入的,因此输出时是反序的,因此想到使用栈结构存储。
 1 #include <iostream>
 2 #include <stack>
 3 #include <vector>
 4 using namespace std;
 5  
 6 int main()
 7 {
 8     int n;
 9     while(cin>>n)
10     {
11         int a[n];
12         for(int i=0;i<n;i++)
13         {
14             cin>>a[i];
15         }
16         stack<int> s;
17         vector<int> v;//中间变量,存储数组中已出现元素
18         int k = 0;
19         for(int i=n-1;i>=0;i--)
20         {
21             s.push(a[i]);
22             v.push_back(a[i]);
23             // 和已出现的所有进行比较
24             for(int j=0;j<v.size();)
25             {
26                 // 不相等就比较已出现数组下一位置
27                 if(a[i-1] != v[j])
28                 {
29                     j++;
30                 }
31                 // 相等,则遍历原数组下一个位置,并且要记得将j置为0,下一还从已出现数组的第一个位置开始比较
32                 else
33                 {
34                     i--;
35                     j = 0;
36                 }
37             }
38         }
39         // 此时存储s的个数,否则如果直接在for循环中和s.size()比较,s.size()是变化的
40         int n = s.size();
41  
42         for(int i=0;i<n-1;i++)
43         {
44             cout<<s.top()<<" ";
45             s.pop();// 出栈
46         }
47         cout<<s.top();
48     }
49     return 0;
50 }
本题更好的方法:定义一个数组b,如果a[i]出现过b[a[i]]++,这样,只有b[a[i]] == 0时才进行插入到stack中
 1 #include <iostream>
 2 #include <stack>
 3 #include <vector>
 4 using namespace std;
 5  
 6 int main()
 7 {
 8     int n;
 9     while(cin>>n)
10     {
11         int a[n];
12         int b[1005]={0};//a[i]最大为1000
13         for(int i=0;i<n;i++)
14         {
15             cin>>a[i];
16         }
17         stack<int> s;
18         for(int i=n-1;i>=0;i--)
19         {
20             if(b[a[i]] == 0)
21             {
22                 s.push(a[i]);
23                 b[a[i]]++;
24             }
25         }
26         int n = s.size();
27  
28         for(int i=0;i<n-1;i++)
29         {
30             cout<<s.top()<<" ";
31             s.pop();// 出栈
32         }
33         cout<<s.top();
34     }
35     return 0;
36 }
原文地址:https://www.cnblogs.com/qqky/p/6912007.html