蓝桥杯2020年校内模拟赛题目整理(上)

今天看了2020年校内模拟赛的讲解视频(前半部分),把自己觉得比较好的记录一下,其实最终还是理解官方的讲解博客。

4.25

4.题目:

1至2019(注意起始)中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
结果为1个整数

解:

自己当时的代码:

public class T3 {

    public static void main(String[] args) {

        int count = 0;

        for (int i = 1; i <=2019; i++) {

            if (i % 10 == 9) {

                count++;

                System.out.println(i);

                continue;

            }else if ((i/10)%10==9) {

                count++;

                System.out.println(i);

                continue;

            }else if ((i/100)%10==9) {

                count++;

                System.out.println(i);

                continue;

            } else if ((i/1000)%10==9) {

                count++;

                System.out.println(i);

                continue;

            }

        }

        System.out.println(count);

    }

}

答案方法:

1、连接成字符串,结合了string.indexOf方法判断数组中是否含有9,其思路主要是利用index0f如果找到了就返回9对应的下标,如果没有找到就返回-1

2、自己又想到的连接成字符串用contains方法判断是否含有9

public class AT3 {

    static final int N = 2019;

      //构造一个静态check函数,判断是否含有9

      static boolean check(int i) {

          String str = i+"";//这一步先把数字换成字符串

          //return str.contains("9");//方法一:用contains方法

          return str.indexOf('9')!=-1;//方法二:返回true=>!=-1,就说明数字中包含9;

      }

    public static void main(String[] args) {

        int count=0;

        for (int i = 1; i <=2019 ; i++) {

        if (check(i)) {

            count++;

        }

    }

        System.out.println(count);

  }

}

5.题目:
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?

对于所有评测用例,1 <= n <= 1000000。

【输入格式】

输入的第一行包含一个整数 n。

【输出格式】

输出一行包含一个整数,表示答案。

【样例输入】

30

【样例输出】

26

【评测用例规模与约定】

对于 40% 的评测用例,1 <= n <= 1000。

对于 80% 的评测用例,1 <= n <= 100000。

对于所有评测用例,1 <= n <= 1000000。//判断出可以暴力解决

解:

自己当时的代码:

public class DT2 {



    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Scanner scanner = new Scanner(System.in);

        long n = scanner.nextLong();

        long count = 0;

        for (int i = 1; i <= n; i++) {

            if (test(i)==true) {

                /* System.out.println(i); */

                count++;

            }

        }

        System.out.println(count);

    }

    public static boolean test(long n) {

        boolean isok = true;

        if ((n%10<(n/10)%10)) {

            return false;

        }else {

            if (n>=10) {

                isok = test(n/10);

            }else {

                return true;

            }

        }

        return isok;

    }

   



}

答案代码:依旧是数字字符串化

public class AT2 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        work();

    }

    private static void work() {

        // TODO Auto-generated method stub

        int n = sc.nextInt();

        int ans = 0;

        for (int i = 1; i <= n ; i++) {

            String s = "" +i;//把整数字符串化

            boolean flag=true;

            for (int j = 1; j < s.length(); j++) {

                if (s.charAt(j-1)>s.charAt(j)) {

                   flag = false;

                   break;

                }

            }

            if (flag) {

                ans++;

            }

        }

        System.out.println(ans);

    }

}

6.题目:

在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0

给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。

【输入格式】

输入的第一行包含一个整数 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。

解:

自己当时的代码:

public class DT1 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int n =scanner.nextInt();

        int[] a = new int[n+1];

        int count = 0;

        for (int i = 1; i < a.length; i++) {

            a[i] = scanner.nextInt();

        }

        int res[] = new int[a.length];

        int i=1,j=1,k=1;

        for ( i = 1; i < a.length; i++) {

            for ( j = i+1; j < a.length; j++) {

                for ( k = j+1; k < a.length; k++) {

                   if (a[i]

答案思路:O(N^2)

枚举每个元素

       该元素与前面的元素比较,找到小的即可

       该元素与后面的元素比较,找到大的即可

       上面两项为真,即说明当前元素可以作为三元组的中心

public class AT4 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        work();

    }

    private static void work() {

        // TODO Auto-generated method stub

        int n,ans = 0;

        n = sc.nextInt();

        int[] data = new int[n];

        for (int i = 0; i < n; i++) {

            data[i]=sc.nextInt();

        }

        for (int j = 1; j < n - 1 ; j++) {

            //int hassmall = 0;//可以改成bool

            boolean hassmall = false;

            for (int i = 0; i < j; i++) {

                if (data[i]

录播课互动答题:

录播课互动答题:

答案:n

蓝桥杯2020年校内模拟赛题目整理(上)_第1张图片

7.题目 原因判断:

【问题描述】

小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。

给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。

元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。

【输入格式】

输入一行,包含一个单词,单词中只包含小写英文字母。

【输出格式】

输出答案,或者为yes,或者为no。

【样例输入】

lanqiao

【样例输出】

yes

【样例输入】

world

【样例输出】

no

【评测用例规模与约定】

对于所有评测用例,单词中的字母个数不超过100。

解:比赛时自己的代码如下   

public static void main(String[] args) {

        // TODO Auto-generated method stub

        Scanner scanner = new Scanner(System.in);

        String word = scanner.next();

        char[] arr = word.toCharArray();

        boolean[] bol = new boolean[word.length()];

        for (int i = 0; i < arr.length; i++) {

            bol[i] =word.charAt(i)=='a'||word.charAt(i)=='e'||word.charAt(i)=='i'||word.charAt(i)=='o'||word.charAt(i)=='u';

        }

       

        boolean[] res = new boolean[word.length()];

        boolean flag = bol[0];

        int num=0;

        res[num] = bol[0];

        for (int i = 0; i < bol.length; i++) {

            if (bol[i]==flag) {

                continue;

            }else {

                num++;

                res[num]=bol[i];

                flag = bol[i];

            }

        }

        if (num==3 && res[0]==false) {

            System.out.println("yes");

        }else {

            System.out.println("no");

        }

    }

}

反思:自己的代码主要和答案中的思路二,比较像,先解决思路2

思路二:

将单词的辅音标记为0,元音标记为1,那么符合要求的单词形态为0+ 1+ 0+ 1

在限定开头必须为0,最后必须为1的情况下,01交替为3次,即前后元素相加结果为1的次数必须为3

public class AT5_2 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        /* long time=System.currentTimeMillis(); */

        if (work()) {

            System.out.println("yes");

        }else {

            System.out.println("no");

        }

        /*

         * long times=System.currentTimeMillis(); System.out.println(times-time);

         */

    }

    static boolean isYuan(char c) {

        return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';

    }

    private static boolean work() {

        String word = sc.nextLine();//或者next()

        int size = word.length();

        if (size<4) {

            return false;

        }

        if (isYuan(word.charAt(0))||!isYuan(word.charAt(size-1))) {//判断,如果第一个和最后一个分别是元音和辅音的话,也可以直接不符合要求,直接返回

            return false;

        }

//引入辅助数组h

        int[] h = new int[size];

        for (int i = 0; i < h.length; i++) {

            if (isYuan(word.charAt(i))) {

                h[i]=1;

            }else {

                h[i]=0;

            }

        }

        int cnt = 0;

        for (int i = 1; i < h.length; i++) {//在限定开头必须为0,最后必须为1的情况下,01交替为3次,即前后元素相加结果为1的次数必须为3

            if (h[i-1]+h[i]==1) {

                cnt++;

            }

        }

        return cnt==3;

    }

}

思路一:正则表达式 java中支持正则表达式

+表示出现一次到若干次

^表示否定,[^aeiou]即非aeiou中的若干次

public class _07 {

    static Pattern p = Pattern.compile("[^aeiou]+[aeiou]+[^aeiou]+[aeiou]+");//编译Pattern

    static Scanner sc = new Scanner(System.in);



    public static void main(String[] args) {

        while (true) { //死循环是为了测试

            if (work())

                System.out.println("yes");

            else

                System.out.println("no");

        }

    }



    static boolean work() {

        String word = sc.nextLine();

        Matcher m = p.matcher(word);

        return m.matches();

    }

}

今天暂时整理到这里,希望自己能够主动学习Java的正则表达式并出一片博客,后三道大题近期整理吧

你可能感兴趣的:(蓝桥2020,计算机基础)