6.递增三元组
/**
问题描述
在数列 a[1], a[2], ..., a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,表示给定的数列。
输出格式
输出一行包含一个整数,表示答案。
样例输入
5
1 2 5 3 5
样例输出
2
样例说明
a[2] 和 a[4] 可能是三元组的中心。
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
* */
算法思想:dp思想,维护两个数组,min[n]和max[n]。分别存储第i个元素之前的最小元素和最大元素,只需要当前元素与min和max数组比较就可以求得是否满足递增三元组的条件。时间复杂度控制在O(n)
话不多说,上代码。
算法思想没有问题,时间复杂度也是最优,可能有些小问题,没有检查出来,如果有错欢迎指正。
public class 递增三元组 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int len=sc.nextInt()+1;
int[] nums = new int[len];
for (int i = 1; i < len; i++) {
nums[i]=sc.nextInt();
}
int[] min = new int[len];
int[] max = new int[len];
//初始化赋值,第一个元素前面最小元素值为第一个元素本身(方便第二个元素判断)
min[1]=nums[1];
min[2]=nums[1];
//初始化赋值,最后一个元素后面最大元素值为最后一个元素本身(方便倒数第二个元素判断)
max[len-1]=nums[len-1];
max[len-2]=nums[len-1];
//由于第二个元素前面最小元素值已经求出来(为第一个元素的值),同理倒数第二个数之后最大元素的值为
//倒数第一个数,所以直接跳过,从第3个数开始维护数组。
for (int i = 3,j=len-3; i < len; i++,j--) {
//维护最小最大值表,如果第i-1个数的值小于i-1前面所有数的最小值(这个值存放在min[i-1中]),
// 则更新前i个数的最小值存放在min[i]中
if (nums[i-1]<min[i-1]) min[i]=nums[i-1];
else min[i]=min[i-1];
if (nums[j+1]>max[j+1]) max[j]=nums[j+1];
else max[j]=max[j+1];
}
//计数器
int count=0;
for (int i = 2; i <len; i++) {
if (min[i]<nums[i]&&max[i]>nums[i]) {
System.out.println(nums[i]);
count++;
}
}
System.out.println(count);
}
}
7.音节判断
【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,
第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。
本来想用一些算法,然后看到问题规模,直接暴力吧,算法时间复杂度为O(n)。本人算法可能有bug,欢迎指正。
算法思想:checkCh()函数是用来检测是否为元音字符,如果是则返回true。
定义了一个flag变量,用来标识当前检测的音节,false检测辅音,true检测元音。首先从检测辅音开始,如果检测结果(checkCh函数的返回值)和我们当前应该出现的音节(flag变量)不同,则说明发生了音节改变,则改变之后检测的音节类型。并且计数器加一。当计数器大于4时,说明不符合规则,输出no。
package org.lanqiao.test1;
import java.util.Scanner;
public class 音节判断 {
public static boolean checkCh(char[] chs,char str){//如果时元音字符返回true
for (char checkCh:chs){
if (checkCh==str) return true;
}
return false;
}
public static void main(String[] args) {
boolean flag=false;//当flag为false时判断辅音,为true时判断元音,程序开始时首先判断辅音
int count=1;
Scanner sc = new Scanner(System.in);
String word=sc.next();
char[] ch=new char[]{'a','e','i','o','u'};
//如果第一个字符为元音则直接输出no
if (checkCh(ch,word.charAt(0))) {
System.out.println("no");
return;
}
//从头到尾判断,盘
for (int i = 1,j=word.length()-1; i <=j; i++,j--) {
//如果判断结果和当前应该判断的音节不同,则说明音节类型改变,需要改变判断的音节类型,并且计数器加一
if (checkCh(ch,word.charAt(i))!=flag) {
flag=!flag;
count++;
}
}
//如果计数器大于4,则说明经历了大于四次的元音辅音变换,则不符合规则
if (count>4) System.out.println("no");
else System.out.println("yes");
}
}