网站的制作,网域高科学校网站管理系统,免费开放api,服务好的专业建站公司目录
1.排序子序列
2.倒置字符串 1.排序子序列
排序子序列_牛客笔试题_牛客网 (nowcoder.com) 首先题干中提到非递增序列和非递减序列#xff0c;那么我们就要先弄明白什么是上述2种序列#xff1a; 非递增序列#xff1a;a[i] a[i1] 如#xff1a;3 2 1 或者 3 3 …目录
1.排序子序列
2.倒置字符串 1.排序子序列
排序子序列_牛客笔试题_牛客网 (nowcoder.com) 首先题干中提到非递增序列和非递减序列那么我们就要先弄明白什么是上述2种序列 非递增序列a[i] a[i1] 如3 2 1 或者 3 3 2 2 1 非递减序列a[i] a[i1] 如1 2 3 或者 1 2 2 3 分析那么如何划分序列
可以从我上面例举的非递增或者非递减序列中发现a[i]和a[i1]重复完全不影响这个序列是什么序列所以首先我们可以考虑在出现这种情况的时候直接遍历过去再看划分子序列的关键点是在当前这种序列中出现不符合特点的情况出现另一种序列的特征那么当前这种序列结束一定可以划分出子序列。
比如题干1 2 3 2 2 1
1 2 3是非递减序列比较过程是1和2比较判断出当前是非递减序列在这个条件下循环依次往后一直比较判断当比较下图3和2时此时已经不符合非递减序列的特点此时可以划分出1个子序列。 小细节我们使用a[i]和a[i1]的方式进行遍历序列比较遍历条件inn为序列长度当in-1时此时i1n如果只开n个空间的话此时下标非法所以我们要多开1个空间即n1。数据我们就放0因为题干数据范围10比最小的数还小并不影响划分子序列。
现在来看代码有注释很好懂
#include iostream
#includevector
using namespace std;int main() {int n0;cinn;vectorintv;v.resize(n1);//多开一个防止越界v[n]0;//数据范围是1n10^50比最小的还小不影响比较for(int i0;in;i){cinv[i];}//初始化完成int i0,count0;while(in){ //非递减序列if(v[i]v[i1]){//in是为了防止i走到n导致越界while(inv[i]v[i1]){i;}//退出while那么一定走到了边界count;i;}else if(v[i]v[i1]){i;//相同不影响直接跳过}//非递增序列else{//in是为了防止i走到n导致越界while(inv[i]v[i1]){i;}//退出while那么一定走到了边界count;i;}}coutcountendl;return 0;
}
2.倒置字符串
倒置字符串__牛客网 (nowcoder.com) 这个题相当经典相信大家应该都做过。
倒置字符串只需要整体先倒置一遍再把每个单词倒置一遍就可以达到输出要求。
我们来说说细节reverse没得说在algorithm头文件里。读取带空格的字符串使用getline(cin,str_name,str_name是你定义的字符串名称。
我们使用迭代器来寻找要倒置的位置string的迭代器就是指针可以看我string类详解中访问及遍历操作中的迭代器模拟实现迭代器在使用的过程中通常是用!str_name.end()来实现遍历条件的。
图解 来看代码有注释很好懂
#include iostream
#includestring
#includealgorithm
using namespace std;int main() {string s;getline(cin,s);reverse(s.begin(),s.end());//直接使用auto让编译器自动识别类型auto starts.begin();while(start!s.end()){auto endstart;while(end!s.end()*end! ){end;}//出来就一定会翻转reverse(start,end);//翻转后更新迭代器//未走到末尾即走到空格if(end!s.end()){startend1; }//走到末尾else{startend;}}coutsendl;return 0;
}