2020第十一届蓝桥杯省赛校内模拟赛试题

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");
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值