目录
题目链接:
输入输出描述&&测试用例:
解析:
程序:
题目链接:
排序子序列_牛客笔试题_牛客网 (nowcoder.com)
输入输出描述&&测试用例:
![]()
测试用例:
输入:
6 1 2 3 2 2 1输出:
2
解析:
题目描述:
将整型数组的连续的数分成若干的连续排序子序列(排序子序列:非递增和非递减排序),问能划分出多少个这样的子序列。
思路:
首先是连续的,那么我们找此排序子序列的基础上是遍历这个数组。
那么先明确一个排序子序列:
明确之后,我们需要在遍历数组的时候划分好两个区域。非递增序列只要满足递减序列的条件就可以进行统计,相对的非递减序列只要满足递增序列的条件就可以进行统计,如果相等就表示非递减非递增,此时跳到下一个值进行比较即可。
跳到某一个序列区域后(使用ifelse语句),可以声明一个计数器,进行++操作就可以统计有多少个字序列了。但是注意如果要跳出此区域的话需要进行循环(连续的),比如测试用例:
既然是遍历数组就需要注意边界控制。
程序:
使用C++程序进行编写,由于是输入n控制数组长度,所以我利用vector作为数组,利用resize一次性确定数组长度(也可以push_back),循环插入时可以利用[]进行操作。此处还涉及一个边界控制:因为遍历数组进行比较来确定区域的时候,是通过当前数和后一个数进行比较,必然用到下标进行访问。当下标超过数组长度就会发生越界访问。为了方便进行控制我们可以在resize的时候多设置一个,存储为0(数据只能是正整数)。因为这样遍历到最后一个元素就会进入非递增序列将最后一个序列进行统一。(也可以实现其他的控制边界方法)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0, count = 0; // 输入数组长度和计数子序列个数
vector<int> v; // 存放数据的数组
cin >> n;
v.resize(n + 1); // 为了方便边界控制,数组长度+1
v[n] = 0; // 最后一个元素置为0
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
int i = 0; // 开始遍历数组进行统计序列
while (i < n)
{
// 非递增区域
if (v[i] > v[i+1]) // []中的i + 1就可以发现我们的边界控制的妙处了
{
count++; // 序列数+1
while (i < n && v[i] >= v[i + 1]) // 序列是一个连续区域,出需要循环遍历此区域完
{ // 注意此处的等于,也表示是一个非递增区域哦
i++;
}
// 结束循环,此处要么i == n 或者此处v[i] < v[i+1] 验证此处以及非递减区域了,此时i必须++,要不然将此数就会算入下一个区域,出现错误,主循环进入下一步即可
i++;
}
else if (v[i] < v[i+1]) // 非递减区域,同理
{
count++;
while (i < n && v[i] <= v[i + 1])
{
i++;
}
i++;
}
else{ // 值相等,跳过
i++;
}
}
cout << count << endl; // 统计结束,输出结果
return 0;
}
加油加油~