题目:设计算法,在数组R[n]中删除重复的元素,要求移动元素的次数较少,并使剩下元素间的相对次序保持不变。
答:问题分析:如果在找到重复数字后,将后面的数全部前移覆盖掉该重复数字,需要大量的移动次数。
思路:利用指针j,指向当前没有重复元素数组的最后一个元素,即R[0]~R[j]中的元素都不重复。因此,j刚开始指向R[0]。从R[1]开始遍历数组继续寻找与R[0]~R[j]不重复的元素。对于第一次出现的数字:
j++;
R[j]=R[i];
对于重复出现的数字,j保持不变。然后i++,继续访问下一个元素。
具体代码:
#include<iostream>
using namespace std;int main(){int n;cout<<"请输入元素个数:"<<endl; cin>>n;int R[n];cout<<"请输入各个元素:"<<endl;for(int i=0;i<n;i++){cin>>R[i];}int j=0;//指针指向当前没有重复元素的数组的最后一个元素for(int i=1;i<n;i++){//从第2个元素开始寻找不重复元素 bool flag=false;for(int k=0;k<=j;k++){if(R[i]==R[k]){flag=true;//有重复元素 }} if(!flag){//如果R[0]~R[j]中没有和R[i]相同的元素 j++;R[j]=R[i];}} cout<<endl<<"一共有"<<j+1<<"个不同的元素:"<<endl; for(int i=0;i<=j;i++){cout<<R[i]<<" ";}return 0;
}