文章目录
- 题目一
- 分析
- 题解
- 题目二
- 分析
- 题解
题目一
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。
输出描述:
输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
分析
说实话,文中最核心的话就是递减递增序列.我们划分子序列的标准就是递减递增序列.核心思路如下:
1.判断递减递增序列
2.进行分组
3.输出结果
题解
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
//长度给n+1防止越界
int[] array = new int[n + 1];
for (int i = 0; i < n; i++) {
array[i] = scan.nextInt();
}
int i = 0;
int count = 0;
while (i < n) {
//进入非递减子序列
if (array[i] < array[i + 1]) {
while (i < n && array[i] <= array[i + 1]) {
i++;
}
count++;
i++;
} else if (array[i] == array[i + 1]) {
i++;
} else {
while (i < n && array[i] >= array[i + 1]) {
i++;
}
count++;
i++;
}
}
System.out.println(count);
}
}
题目二
描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分区分
分析
其实这里你看这道题,我们不难分析出俩个步骤:
1.先倒置整体
2.再倒置单词
用这俩个步骤就解决了.
题解
代码展示:
import java.util.*;
public class Main {
//逆置字符串的方法
public static void reverse(char[] array, int start, int end) {
while (start < end) {
char tmp = array[start];
array[start] = array[end];
array[end] = tmp;
start++;
end--;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
char[] ch = s.toCharArray();
int len = ch.length;
//1、整体进行了逆置
reverse(ch, 0, len - 1);
int i = 0;//遍历ch数组
//2.进行局部逆置
while ( i < len ) {
int j = i;
//如果等于不等于空格,就继续++
while (j < len && ch[j] != ' ') {
j++;
}
//走到这里说明找到了空格,开始进入逆置
if (j < len) {
reverse(ch, i, j - 1);
i = j + 1;
} else {
reverse(ch, i, j - 1);
i = j;
}
}
String str = new String(ch);
System.out.println(str);
}
}