注册 登录
编程论坛 C++教室

感谢大佬的帮忙,就下面这道题啊啊啊啊

我真傻,真的 发布于 2020-03-15 17:47, 1756 次点击
已知输入系列中各元素的值至少有两个元素,设计算法,求出该序列中元素的所有最大升降子序列。例如(1.20.30.12.3.5.7.4.6.100)输出为(1.20.30).(30.12.3).(3.5.7).(7.4).(4.6.100)
7 回复
#2
林月儿2020-03-15 20:10
程序代码:
#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编辑过]

#3
xianfajushi2020-03-16 10:07
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-3-16 10:11编辑过]

#4
lin51616782020-03-17 15:37
题主 你的问题描述不够详细
需要确定一下 输入元素 会不会有相同元素
比如
1 2 3 4 1 1 1 2 3
如果存在相同元素 按照题目要求 会出现
1 2 3 4
4 1 1 1
1 1 1 2 3
那么 前面2位的实现 应该都是错了

顺便说一点题外话
3楼的代码里面 cout << ends;
这个做法是错误的 ends 不是给cout使用的参数
不要被误导
#5
叶纤2020-03-17 17:18
回复 4楼 lin5161678
那个在cpp中是可以cout<<ends;的ends的作用是在缓冲区插入一个空终止作为字符串来使用,而且一般和std :: basic_ostream一起使用
最好还是查清楚再吐槽,对的错的不能乱说啊
#6
叶纤2020-03-17 17:58
虽然我不赞同xianfajushi图片式和博客式的教育方法,而且代码很脑筋急转弯,关键逻辑的地方没有括号,说明他的运算符优先级已经掌握在心中了,不过还有很多值得学习的地方,先花花送一朵,就是对于新手不怎么友好,容易造成劝退,学cpp的本来就很少能坚持下去的,自学的更少了,不过还是增加新手的学习兴趣比较好,xianfajushi有句话说的很好,帮助他人的同时也是帮助自己,好人做到底,怎样才能一举两得呢?自己可以学习的到,新手也能有兴趣
#7
lin51616782020-03-17 18:21
以下是引用叶纤在2020-3-17 17:18:03的发言:

那个在cpp中是可以cout<<ends;的ends的作用是在缓冲区插入一个空终止作为字符串来使用,而且一般和std :: basic_ostream一起使用
最好还是查清楚再吐槽,对的错的不能乱说啊

ends的作用是在缓冲区插入一个空终止作为字符串来使用
所以
cout << ends;
等于
cout << '\0';
'\0'是不可显示字符
在不同环境运行环境表现不一样
有的地方不输出
只有本站会员才能查看附件,请 登录

有的地方输出空格
只有本站会员才能查看附件,请 登录

甚至有的地方输出 a
https://bbs.

所以我说 cout << ends 是错的 ends不是给cout使用的参数
你自己也说了是和std :: basic_ostream一起使用
 

[此贴子已经被作者于2020-3-17 18:27编辑过]

#8
lin51616782020-03-17 18:23
回复 6楼 叶纤
我不说 你自觉你需要多长时间才能了解到 cout<<ends 这个做法存在问题?
1