【每日一练】倒置字符串 && 排序子序列(C++实现)

文章目录

  • 倒置字符串
    • 题目链接
    • 思路
    • 代码实现
  • 排序子序列
    • 题目链接
    • 思路
    • 代码实现

倒置字符串

题目链接

倒置字符串
将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。字符串长度不超过100。

示例1
输入:

I like beijing.

输出:

beijing. like I

思路

第一步:首先对整个字符串逆置(可以利用库函数,reverse)
如图:
【每日一练】倒置字符串 && 排序子序列(C++实现)_第1张图片
第二步:整体逆置后,定义两个迭代器,start 和 end,一开始都指向字符串的首字母

第三步:end遍历字符串,当遇到空格就停止,或者到字符串结尾即s.end()时,停止遍历

此时,start 和 end 的区间就是一个单词,注意区间时左闭右开的,因为单词不包括空格,再者,库函数的实现一般也是使用左闭右开区间。

【每日一练】倒置字符串 && 排序子序列(C++实现)_第2张图片

第四步:逆置完一个单词后,start就指向end的下一个位置(因为当前end所指向的字符是空格),然后将end指向start,再次遍历字符串,遇到空格或到字符串末尾s.end()时停止
【每日一练】倒置字符串 && 排序子序列(C++实现)_第3张图片

第五步:当end等于s.end()的时候,就表示逆置到最后一个单词了,将最后一个单词逆置后,start就不用再指向end的下一个位置了,直接将end赋值给start即可。
所以可以知道循环结束的条件是:start == s.end()
【每日一练】倒置字符串 && 排序子序列(C++实现)_第4张图片

代码实现

#include 
#include 
#include 

using namespace std;

int main()
{
    string str;
    getline(cin, str);
    //1.进行整体逆置
    reverse(str.begin(), str.end());

    //2.单个单词逆置
    string::iterator start = str.begin();//迭代器

    while (start != str.end())
    {
        auto end = start;

        while (end != str.end() && *end != ' ')
        {
            end++;
        }

        reverse(start, end);//库函数中的参数是指针,不能用整形数据

        if (*end == ' ')
        {
            start = end + 1;
        }
        if (end == str.end())
        {
            start = end;
        }
    }
    cout << str << endl;

    return 0;
}

排序子序列

题目链接

排序子序列
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

输入描述:

输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)

第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。

示例1
输入

6
1 2 3 2 2 1

输出

2

思路

首先弄明白什么是非递减和非递增:
【每日一练】倒置字符串 && 排序子序列(C++实现)_第5张图片
数组数据有三种情况:
if(a[i] < a[i+1]),表示是非递减子序列
if(a[i] == a[i+1]),直接往后++
if(a[i] > a[i+1]),表示是非递增子序列

第一步:定义一个数组,大小为n+1,防止在比较时,产生越界访问,最后一个数据值设为0,因为n个数据都是大于等于1的数据,都比0大,所以不会影响最后结果
在这里插入图片描述

第二步:进行遍历比较

代码实现

#include 
#include 

using namespace std;

int main()
{
    int n = 0;
    cin>>n;
    
    vector<int> ret;
    ret.resize(n + 1);//防止越界访问
    ret[n] = 0;//因为整个数组都是正整数,都比0大,定义成0,不会影响
    
    for(int i = 0; i < n; ++i)
    {
        cin>>ret[i];
    }
    
    int i = 0;
    int count = 0;
    while(i < n)
    {
        //进入非递减序列
        if(ret[i] < ret[i+1])
        {
            while(i < n && ret[i] <= ret[i+1])
            {
                i++;
            }
            count++;
            i++;
        }
        //一开始头两个就相等
        else if(ret[i] == ret[i+1])
        {
            i++;
        }
        else
        {
            while(i < n && ret[i] >= ret[i+1])
            {
                i++;
            }
            count++;
            i++;
        }
    }
    cout<<count<<endl;
    return 0;
}

你可能感兴趣的:(每日一练,leetcode刷题,c++)