题目1:
倒置字符串_牛客题霸_牛客网
 
我们先写出代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	getline(cin, s);
	reverse(s.begin(), s.end());
	auto start = s.begin();
	while (start != s.end())
	{
		auto end = start;
		while (end != s.end() && *end != ' ')
		{
			end++;
		}
		if (end != s.end())
		{
			reverse(start, end);
			start = end + 1;
		}
		else
		{
			reverse(start, end);
			start = end;
		}
	}
	cout << s << endl;
	return 0;
}我们先说思路:我们可以先将整个的字符串进行倒置,然后再把每一个单词进行导致,实现我们的要求
我们先创建一个string对象,使用getline函数,目的是防止让‘ ’变为有效字符,而不是多组输入的标志,然后我们使用reserve函数,对s.begin()到s.end()进行逆置,逆置后的图像是这样的:

接下来,我们的思路是这样的:我们设置两个指针,第一个指针start指向对象的第一个字符的位置,第二个指针end也指向第一个字符的位置,然后让第二个指针end遍历对象来进行判断,假如对应的数组元素为' '时,我们先调用reverse函数把start和end之间的单词进行交换,然后把end+1赋值给start,继续遍历下一个单词。
注意:这个循环有两处停滞点,第一处是当end遭遇\0时,第二处是当end到s.end()位置时,对于第一个,我们先调用reverse函数进行逆置,然后把end+1赋给start即可。对于第二个,我们先调用reverse函数进行逆置,然后把end赋给start即可。
我们的循环的结束条件是当start和s.end()指向同一个位置时,循环结束。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	string s;
	getline(cin, s);
	reverse(s.begin(), s.end());
	auto start = s.begin();
	auto end = start;
	while (start != s.end())
	{
		end = start;
		while (end != s.end() && *end != ' ')
		{
			end++;
		}
		reverse(start, end);
		if (end != s.end())
		{
	
			start = end + 1;
		}
		else
		{
			start = end;
		}
	}
	cout << s << endl;
	return 0;
}题目2:
 

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<int> a;
	a.resize(n);
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	int i = 0;
	int count = 0;
	while (i < n)
	{
		if (a[i] < a[i + 1])
		{
			while (i < n&&a[i] <= a[i + 1])
			{
				i++;
			}
			count++;
			i++;
		}
		else if (a[i] == a[i + 1])
		{
			i++;
		}
		else
		{
			while (i < n&&a[i] >= a[i + 1])
			{
				i++;
			}
			count++;
			i++;
		}
	}
	cout << count << endl;
}我们对题目进行分析:我们要先理解非递增和非递减的意义:非递增包括递减和相等,转换为代码的形式就是这样:a[i]>=a[i+1]

我们首先要创建变量n,输入n值,这个n就是我们数组元素的个数,然后我们创建n个空间的数组a,使用resize函数,开辟n个空间供我们数组使用。
接下来,我们使用for循环,输入元素到数组中,接下来,我们就开始查找排序子序列的个数。
我们的思路如下:

i是数组首元素的下标,让i和i+1的下标对应的元素进行比较,a[i]<=a[i+1],表示我们接下来的序列是非递减序列,我们继续遍历,2和3也满足非递减序列,继续遍历,a[i]>a[i+1],不满足非递减序列,表示接下来的序列是非递增序列,我们之前的非递减序列已经结束,我们设置count来继续序列的次数,这时候count+1,我们继续往后遍历,2与2满足非递增序列,我们继续遍历,2和1满足非递增序列,这时候,我们已经遍历完全部的数组元素,我们再让count++,返回count即可。
我们来结合代码分析:

i是数组元素的下标,所以不能越界,让其小于n
当i下标对应的元素小于i+1下标对应的元素,表示我们是非递减序列,我们进入非递减序列的处理方法,非递减序列可能是很长的序列,所以我们需要使用while循环,首先为了防止while循环内部越界,我们首先让i<n并且当i对应的元素和i+1对应的元素满足非递减序列时,下标i++
当while循环结束时,表示我们不再满足递减序列或者遍历数组完毕,我们让count++,i++

当i对应的元素和i+1对应的元素相等时,同时满足非递减序列和非递增序列,我们不需要进行处理,只需要让i++即可。

当a[i]>a[i+1],表示我们满足非递增序列,非递增序列可能会很长,所以我们需要while循环来继续宁遍历,为了防止循环内越界,我们要让i<n,并且我们要满足非递增排序,当退出循环时,表示数组已经遍历完毕或者非递增序列已经结束,这时候我们让count++,让i++.
然后我们打印数组即可。
但是我们这里依旧有越界的存在:

当i=n-1时,a[i+1]就会造成越界访问吗,针对这个问题,我们可以这样处理:

我们可以多申请一个空间,这样我们进行访问就不会造成越界访问。

















![[附源码]计算机毕业设计springboot4S店汽车售后服务管理系统](https://img-blog.csdnimg.cn/81c1c496fb414d60a8058086aee0ba3b.png)


