> 文章列表 > 【笔试强训编程题】Day2.(排序子序列 100448)和(倒置字符串 69389)

【笔试强训编程题】Day2.(排序子序列 100448)和(倒置字符串 69389)

【笔试强训编程题】Day2.(排序子序列 100448)和(倒置字符串 69389)

文章目录

前言

一、排序子序列 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.再遍历字符串,找出每个单词,对单词逆置;


代码实现:

图示说明:

图一; 


图二:

 

总结

今天的两道编程题就介绍到这里,希望各位能够熟练掌握并且能够自己编写!