文章目录
- 排序子序列问题
- 思路:
- 代码:
- 倒置字符串
- 思路:
- 方法一:
- 代码:
- 方法二:
- 代码:
排序子序列问题
题目链接
这道题题意不难理解,但是想写对还是有很多细节的。
本题要求解的是排序子序列,排序子序列为非递增或者非递减,非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1],非递增就是a[i]>=a[i+1],递增就是a[i]<a[i+1]。
思路:
- 本题依次比较整个数组
- a[i+1]>a[i] ,则进入非递减序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位置的判断。
- a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位置的判断。
- a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减序列。
本题注意点:本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0;a[n] = 0带来的影响,我们分为三种情况讨论:
- 若到a[n-1] 的最后一组是非递减序列,当i==n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入条件已经说明了(去看看题目输入条件描述),里面的循环结束,i++,count++,i ==n,外面的循环结束。
- 若到a[n-1] 的最后一组是非递增序列,当i== n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入条件已经说明了(去看看题目输入条件描述),循环再走一次,i++, i== n,里面的循环结束,i++,count++,i==n+1,外面的循环结束。
- 第三种情况 1 2 1 2 1最后一个数是单独的情况,后面补个0,序列变成1 2 1 2 1 0,当走完全面的序列i== n-1时,a[i] > a[i+1],这样会判断出一个非递增序列,count++,i++, i== n 外面的循环结束。
也就是说数组最后一个位置多增加一个0,不会影响第1、2情况的判断,主要是帮助第3情况的正确判断。
代码:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int num = 0;
cin >> num;
vector<int> v;
v.resize(num + 1);
v[num] = 0;
for (int i = 0; i < num; i++)
{
cin >> v[i];
}
int count = 0;
int j = 0;
while (j<num)
{
if (v[j] < v[j + 1])
{
while (j<num&&v[j]<=v[j+1])
{
j++;
}
count++;
j++;
}
else if(v[j]==v[j+1])
{
j++;
}
else
{
while (j < num && v[j] >= v[j + 1])
{
j++;
}
count++;
j++;
}
}
cout << count << endl;
return 0;
}
倒置字符串
题目链接
思路:
方法一:
先创建一个两个string类分别命名为str和temp,用getline把一行输入到str中,然后倒着遍历str,遇到空格就将空格之后的字符串整体尾插到temp中,然后再把刚才空格之后的字符串从str中删去,直到遍历到str的下标为0位置处停止。
但是这样会少了开头的一串字符串
例如:I like beijing.
倒着遍历的话I前面可没有空格,而且已经倒履str下标为0的位置处了,退出while循环,所以下面还要把第一个空格之前的字符串补回来即可。
代码:
#include<iostream>
#include <string>
using namespace std;
int main()
{
string str;
//std::getline(cin,str);
std::getline(std::cin, str);
string temp;
for (int i = str.size() - 1; i >= 0; i--)
{
if (str[i] == ' ')
{
temp.append(str, i + 1);
temp += ' ';
str.erase(i);
}
}
temp.append(str);//把第一个空格之前的字符串补回来
cout << temp;
return 0;
}
方法二:
第二思路是一个比较取巧的思路,直接利用cin>>s接收输入,遇到空格就结束了,自然就分割开了每个单词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了。
代码:
#include <iostream>
#include <string>
using namespace std;
// cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出
int main()
{
string s1, s2;
cin >> s2;
while (cin >> s1)
s2 = s1 + " " + s2;
cout << s2 << endl;
return 0;
}
end