《牛客C++刷题第一期》

目录

1.倒置字符串

2.排序子序列


1.倒置字符串

涉及内容:string,iterator迭代器,getline获取字符串到'\n’停止,头文件<algorithm>的库函数reverse逆置

解题思想:三个迭代器,两个迭代器分别做头(begin)和尾(end),首先都为尾,begin向前寻找空格,第三个迭代器(space)充当接收begin得到的空格位置的迭代器,只用在循环体末尾将space赋值给end就行,而begin++就得到了end后面的值,直到begin--到等于str.begin停止循环,进入goto再进行最后一次循环。

注意:end得到的是要逆置的最后一个字符的下一个地址,所以本应当的‘\0’或者是本题的'空格’不需要再向前移动,另外迭代器‘\0’的位置不能解引用,所以才有先--后判断的写法,这便是C++的安全性之一,其次cin换成getline是因为cin是遇到空格结束,而getline是遇到‘\n’结束。

牛客链接:倒置字符串

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string str;
    getline(cin, str);
    reverse(str.begin(), str.end());
    string::iterator begin = str.end();/*end获取的是'\0'的迭代器,但是不起什么作用,起的是最后一个值的下一个地址*/
    string::iterator end = str.end();
    while (begin != str.begin())
    {
        while (begin != str.begin())
        {
            begin--;
            if (*begin == ' ')
            {
                break;
            }
        }
        if (begin == str.begin())
        {
            goto Goto;
        }
         string::iterator space = begin;
         begin++;
         reverse(begin, end);
         begin = end = space;
         begin--;
    }
    Goto:reverse(begin, end);
    cout << str << endl;
    return 0;
}

2.排序子序列

设计内容:循环,vector顺序表

解题思想:/*思路:从头开始分三种一种是开头递增,一种是开头递减,一种是开头相等*/
/*一个增(减)趋势结束后++,而等趋势也是++*/
/*非递增包括'递减'和'全等'和'递减+全等',非递减包括递增和全等和'递增+全等'*/
/*其中操作的是当前下标值和下一个下标值,由于每一个都要遍历,当到最后一个时,下标+1则会越界访问*/
/*所以开空间多开一个,由题可知每个值都是大于等于1的,所以多开的空间初始化为0*/

注意:越界访问

牛客链接:排序子序列

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    vector<int> arr;
    arr.resize(n+1);
    for (int i = 0; i < n; ++i)
    {
        cin >> arr[i];
    }
    arr[n] = 0;
    int i = 0;
    int count = 0;/*计算组数*/
    while (i < n)/*因为需要操作的不只是i++那么简单,分条件i++,所以用while循环*/
    {
        if (arr[i] < arr[i + 1])
        {/*非递减序列<=,找到非递增序列后停下*/
            while (i < n && arr[i] <= arr[i + 1])/*1 2 3 4 5增序列需要限制条件i<n,否则i一直++会越界访问,其次i=n-1,arr[i+1]也会越界访问,所以根据题的条件可知每个值都是大于等于1的,所以多开一个空间置0*/
            {
                i++;
            }
            /*这一组完成*/
            count++;
            i++;/*指向下一个坐标*/
        }
        else if (arr[i] == arr[i + 1])/*如果是全都是一样的,最后多开空间会跳到else语句,i==n while循环不执行,但count执行,count最终是1*/
        {
            i++;
        }
        else
        {
            if (arr[i] > arr[i + 1])
            {
                while (i < n && arr[i] >= arr[i + 1])
                {
                    i++;
                }
                /*这一组完成*/
                count++;
                i++;/*指向下一个坐标*/
            }
        }
    }
    std::cout << count << endl;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值