一.排序子序列
题目链接:
题目描述:
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为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:
输入:
6
1 2 3 2 2 1
输出:
2
个人思路:
定义一个flag,0表示相等、1表示递增、-1表示递减,然后循环遍历即可。
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int count = 1;
int flag = 0;//定义一个标志 0表示相等; 1表示递增; -1表示递减
for (int i = 1; i < n; i++) {
if (arr[i] > arr[i - 1]) {
if (flag == 0) {
flag = 1;
} else if (flag == -1) {
flag = 0;
count++;
}
}
if (arr[i] < arr[i - 1]) {
if (flag == 0) {
flag = -1;
} else if (flag == 1) {
flag = 0;
count++;
}
}
}
System.out.println(count);
}
}
二.倒置字符串
题目链接:
题目描述:
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例1:
输入:
I like beijing.
输出:
beijing. like I
个人思路:
写一个逆置函数,然后遍历字符数组,当遇到空格时,逆置[left, i - 1]区间的单词,然后跟新left = i + 1,最后一个单词因为后面没有空格,所以循环结束之后单独拉出来逆置一下,最后整体逆置就可以得到结果了。
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char[] chs = s.toCharArray();
int left = 0;
int i = 0;
for (; i < chs.length; i++) {
if (chs[i] == ' ') {
//遇到空格逆置
swap(chs, left, i - 1);
left = i + 1;
}
}
//逆置最后一个单词
swap(chs, left, i - 1);
//逆置整个字符串
swap(chs, 0, i - 1);
System.out.println(String.valueOf(chs));
}
public static void swap(char[] chs, int left, int right) {
while (left < right) {
char c = chs[left];
chs[left] = chs[right];
chs[right] = c;
left++;
right--;
}
}
}