感谢大佬的帮忙,就下面这道题啊啊啊啊
已知输入系列中各元素的值至少有两个元素,设计算法,求出该序列中元素的所有最大升降子序列。例如(1.20.30.12.3.5.7.4.6.100)输出为(1.20.30).(30.12.3).(3.5.7).(7.4).(4.6.100)
程序代码:
#include <iostream> #include <string> #include <vector> #include <stdlib.h> using namespace std; int main() { string str; cout << "请输入:"; cin >> str; int len = str.size(); // 1.20.30.12.3.5.7.4.6.100 vector<string> vec; int cursor = -1; while (cursor < len) { int index = cursor + 1; cursor = str.find('.', cursor + 1); if (cursor < 0) { vec.push_back(str.substr(index)); break; } vec.push_back(str.substr(index, cursor - index)); } if (vec.size() < 3) { cout << '(' << str << ")"; return 0; } int markIndex = -1; int count = 1; for (int i = 1; i < vec.size() - 1; i++) { int vec0 = atoi(vec[i-1].c_str()); int vec1 = atoi(vec[i].c_str()); int vec2 = atoi(vec[i+1].c_str()); int cmp_res = (vec0- vec1) * (vec1 - vec2); if (markIndex < 0) { if (cmp_res > 0) { markIndex = i-1; count += 2; } else { cout << '(' << vec[i-1] << '.' << vec[i] << ")."; markIndex = -1; count = 1; } } else if(cmp_res > 0) { count++; } else { cout << '('; for (int j = markIndex; j < markIndex + count; j++) { cout << vec[j]; if(j < markIndex + count - 1) { cout << '.'; } } cout << ")."; markIndex = -1; count = 1; } if (i == vec.size() -2) { if (markIndex < 0) { cout << '(' << vec[i] << '.' << vec[i+1] << ')'; } else { cout << '('; for (int j = markIndex; j < markIndex + count; j++) { cout << vec[j]; if(j < markIndex + count - 1) { cout << '.'; } } cout << ")"; } } } return 0; }
[此贴子已经被作者于2020-3-15 20:12编辑过]