题目:
已知输入序列中各元素的值至少有两个元素。设计算法求出该序列中元素的所有最大升、降子序列。例如,若元素依次为(1,20,30,12,3,5,7,4,6,100,11,8),则输出结果为(1,20,30),(30,12,3),(3,5,7),(7,4),(4,6,100),(100,11,8)。
思想:
其实这个代码还应该加一个,如果a.size()==2,直接输出,goto结束程序。懒得弄了。
思想主要是,设置头尾指针(start = 0,end),从头遍历数组,若该元素前后大小于关系不一致,该店就是end点,然后从start到end输出。输出完成后将该点设置成新的start点。
等到下一个end发现时再继续上述步骤。
若是遍历到倒数第二个点,将最后一个点设置为end点,最后一次输出。
代码:
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
cout<<"—————— 逐个输入数组元素 , 以空格隔开 —————— "<<endl;
vector<int> a;
int i = 0;
do{
cin >> i;
a.push_back(i);
}while(getchar() !='\n');
int start = 0;
int end;
for(int i = 1; i < a.size()-1; i++){
if( ((a[i-1]>a[i]) & (a[i]<a[i+1]) ) | ( (a[i-1]<a[i]) & (a[i]>a[i+1]) ) ){
end = i;
cout<<"(";
for(int j=start; j<end+1;j++){
cout<<a[j];
if(j!=end) cout<<",";
}
cout<<")"<<endl;
start = end;
}
if(i==a.size()-2){
end = a.size()-1;
cout<<"(";
for(int j=start; j<end+1;j++){
cout<<a[j];
if(j!=end) cout<<",";
}
cout<<")"<<endl;
}
}
return 0;
}—————— 逐个输入数组元素 , 以空格隔开 ——————
1 20 12 3 5 7 4 6 100 11 8
(1,20)
(20,12,3)
(3,5,7)
(7,4)
(4,6,100)
(100,11,8)------------------------------------------------------------------------------------
版权声明:本文为Drifter_Galaxy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。