[编程题] 消除重复元素
时间限制: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 }