1.题目:
Problem Description
从由小到大有序的顺序表中删除其值在[s, t]之间(含s和t)的所有元素,且不改变顺序表的有序性。如果s>=t则显示“data error”;否则输出顺序表的表长和顺序表中的元素,若处理后的顺序表为空,则不输出任何信息。
Input
输入的第一行为一个数字n,表示下面有n组数据,每组数据包括3行;每组数据中的第一行包含两个数字s和t,第二行为顺序表的表长len(0<len<=20),第三行为顺序表的数据元素。
Output
对于每组数据,如果s>=t,则直接输出“data error”,否则输出两行信息:第一行为处理后顺序表的表长,第二行为处理后顺序表中的元素,元素之间用一个空格分隔,如果处理后的顺序表为空,则不输出任何信息。
Sample Input
1
8 18
7
1 3 5 10 17 19 25
Sample Output
5
1 3 5 19 25
2.参考代码:
#include <iostream> using namespace std; class LinkList{ private: int data[100],len; public: LinkList(int* a,int n); void Delete(int l,int r); void show(); }; LinkList::LinkList(int* a,int n){ for(int i=0;i<n;i++) data[i]=a[i]; len=n; } void LinkList::Delete(int l,int r){ ///核心代码 int k=0; for(int i=0;i<len;i++) { if(data[i]>=l && data[i]<=r) k++; ///计算在范围之内的个数 else data[i-k]=data[i]; ///不在范围之内就前移,边计算边移动 } len-=k; } void LinkList::show(){ if(len==0) return ; cout<<len<<endl<<data[0]; for(int i=1;i<len;i++) cout<<" "<<data[i]; cout<<endl; } int main() { int i,t,m,n,len,a[100]; cin>>t; while(t--) { cin>>m>>n>>len; for(i=0;i<len;i++) cin>>a[i]; if(m>=n) { cout<<"data error\n"; continue; } LinkList w(a,len); w.Delete(m,n); w.show(); } return 0; }