目录
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;
}