文章目录
前言
一、排序子序列 100448
题目描述
代码实现
二、倒置字符串 69389
题目描述
代码实现
总结
前言
今天让我们来练习两道经典的编程题!!!!
一、排序子序列 100448
题目描述:
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5) 第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。
输出描述:
输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
示例:
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2;
题目解析:
思路分析:
首先我们要先了解子序列和序列排序的有关概念:
子序列:
序列排序:
排序的几种方式:
这个题目需要遍历比较相邻数字的大小,所以一共会出现三种情况:
1.ary[i]=ary[i+1]
这种情况不进行操作,因为相等不属于递增也不属于递减,所以continue,进行下一次遍历
2.ary[i]<ary[i+1]
这种情况属于递增区间,需要嵌套while循环继续向后遍历,直到出现ary[i]>ary[i+1],则该区间结束,i++;
3.ary[i]>ary[i+1]
这种情况属于递减区间,需要嵌套while循环继续向后遍历,直到出现ary[i]<ary[i+1],则该区间结束,i++;
a[n] = 0带来的影响,我们分为三种情况讨论:
1. 若到a[n-1] 的最后一组是非递减序列,当i==n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入 条件已经说明了(去看看题目输入条件描述),里面的循环结束,i++count++,i==n,外面的循环结 束。2. 若到a[n-1] 的最后一组是非递增序列,当i==n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入 条件已经说明了(去看看题目输入条件描述),循环再走一次,i++, i== n,里面的循环结束,i++, count++,i==n+1,外面的循环结束。3. 第三种情况 1 2 1 2 1最后一个数是单独的情况,后面补个0,序列变成1 2 1 2 1 0,当走完全面的序列 i==n-1时,a[i] > a[i+1],进入判断出一个非递增序列,count++,i++,循环结束。4. 也就是说数组最后一个位置多增加一个0,不会影响第1、2情况的判断,主要是帮助第3情况的正确判断。
代码实现:
输出结果:
本题注意点:
本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0;
图一;
二、倒置字符串 69389
题目描述:
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100;
输出描述:
依次输出倒置之后的字符串,以空格分割;
示例:
输入:I like beijing.
输出:beijing. like I
题目解析:
思路分析:
1.先将整个字符串逆置过来;
2.再遍历字符串,找出每个单词,对单词逆置;
代码实现:
图示说明:
图一;
图二:
总结
今天的两道编程题就介绍到这里,希望各位能够熟练掌握并且能够自己编写!