2020蓝桥杯模拟赛(Java)

模拟赛时长四个小时,本菜鸟只做出来8个题,代码奉上,本人学Java才半年,各位请多多指教!
在这里插入图片描述

第一题(一个循环搞定)
答案:96

// 1200000有多少个约数(只计算正约数)
public class Main {
public static void main(String[] args) {
int result = 1200000, sum = 0 ;
for(int i=1; i<=1200000; i++) {
	if(result % i == 0) {
		sum ++ ;
	}
}
System.out.println(sum);
}
}

第二题(很简单,直接打印)
答案:15488

// 在计算机存储中,15.125GB是多少MB
public class Main {
public static void main(String[] args) {
System.out.println(15.125 * 1024);
}
}

第三题
思路:用一个方法判断数字的每一位中是否含有数字9,然后调用函数做判断,找出1~2019中的含有9的数字,用sum累加出结果。
答案:544

// 在1至2019中,有多少个数的数位中包含数字9?
//注意,有的数中的数位中包含多个9,这个数只算一次。
//例如,1999这个数包含数字9,在计算只是算一个数。 

public class Main {
public static boolean getResult(int num) {
	boolean sum = false;
	String s = String.valueOf(num) ;
	for(int i=0; i<s.length(); i++) {
		if(s.charAt(i) == '9') {
			sum = true ;
			i = s.length() ;
			break ;
		}
	}
	return sum ;
}
public static void main(String[] args) {
int sum = 0 ;
for(int i=1; i<=2019; i++) {
if(getResult(i)) {
	sum ++ ;
}
}
System.out.println(sum);
}
}

第四题(很简单,口算)
一棵二叉树包含有2019个结点的树,最多包含多少个叶结点?
思路:画个二叉树就出来了,其实就是(2019+1)/ 2
答案:1010

第五题
思路:写个方法list去判断字符受否是元音字符,就五个元音字符。然后在另一个方法judge中判断是否满足条件,如果第一个是辅音字符,最后一个是元音字符,且元音到辅音或辅音到元音的转换次数为3次,转换次数用flag标记。则说明满足条件,否则都是不满足条件的。

/*
 问题描述
  小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,
第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,
第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
输入格式
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
  输出答案,或者为yes,或者为no。
样例输入
lanqiao
样例输出
yes
样例输入
world
样例输出
no
 */
import java.util.Scanner ;
public class Main {
public static boolean list(char s) {
	boolean result = false ;
    if(s == 'a' || s == 'e' || s =='i' || s == 'o' || s =='u') {
    	result = true ;
    }
    return result ;
}
public static void judge(String s) {
	int flag = 0 ;
	if(list(s.charAt(0))) {
		System.out.println("no");
	}
	if(!(list(s.charAt(s.length()-1)))) {
		System.out.println("no");
	}
	for(int i=0; i<s.length()-1; i++) {
		if((list(s.charAt(i)) && !list(s.charAt(i + 1))) || (!list(s.charAt(i)) && list(s.charAt(i + 1)))) {
			flag ++ ;
		}
	}
	
	if(flag == 3 && !list(s.charAt(0)) && (list(s.charAt(s.length()-1)))) {
		System.out.println("yes");
	}
}
public static void main(String[] args) {
Scanner input = new Scanner (System.in) ;
String s = input.next() ;
judge(s) ;
}
}

第六题
思路:写一个方法,判断数字是否是数位递增数,判断方法是将整数转换成字符串再转换成字符数组1,将数组1的元素依次存放到数组2中,对数组元素1由小到大排序后存到新的数组3中,然后对比数组2和数组3中的元素,全部相等则为递增数,否则不是,然后再主函数中循环找出1~n中满足递增数的数字打印。

/*
 问题描述
 一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,
例如1135是一个数位递增的数,而1024不是一个数位递增的数。
  给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
输入格式
  输入的第一行包含一个整数 n。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
30
样例输出
26
 */
import java.util.Scanner ;
import java.util.Arrays;
public class Main {
public static boolean judgeNum(int n) {
boolean flag = true ;
String s = String.valueOf(n) ;
char [] arr = s.toCharArray();
char [] newarr =  new char [arr.length] ;
for(int i=0; i<arr.length; i++) {
	newarr[i] = arr[i] ;
}
Arrays.sort(newarr);
for(int i=0; i<arr.length; i++) {
	if(arr[i] != newarr[i]) {
	   flag = false ;
	   i = arr.length ;
	}
}
return flag ;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int sum = 0 ;
int num = input.nextInt() ;
for(int i=1; i<=num; i++) {
	if(judgeNum(i)) {
		sum ++ ;
	}
}
System.out.println(sum);
}
}

运行结果如下:
在这里插入图片描述
第七题
思路:此题的解法虽然运行出正确结果,但是不一定满足所有的测试用例,我用到了三层循环,当测试数据过多时,可能超时。

/*
 问题描述
  在数列 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] 可能是三元组的中心。
 */
import java.util.Scanner ;
import java.util.Arrays;
public class Main {
public static void getNum(int [] arr) {

int sum = 0 , result = 0 ;
int [] newarr1 = new int [arr.length] ;
int [] newarr2 = new int [arr.length] ;
for(int i=0; i<arr.length; i++) {
newarr1[i] =arr[i] ;
newarr2[i] = arr[i] ;
}
for(int i=0; i<arr.length; i++) {
for(int j=i+1; j<newarr1.length; j++) {
for(int k=j+1; k<newarr2.length; k++) {
	if(arr[i] < newarr1[j] && arr[i] < newarr2[k] && newarr1[j] < newarr2[k]) {
		sum ++ ;
	}
}
}
}
int [] a = new int [sum] ;
int x = 0 ;
for(int i=0; i<arr.length; i++) {
for(int j=i+1; j<newarr1.length; j++) {
for(int k=j+1; k<newarr2.length; k++) {
	if(arr[i] < newarr1[j] && arr[i] < newarr2[k] && newarr1[j] < newarr2[k]) {
		a[x]  = j;
		x ++ ;
	}
}
}
}

Arrays.sort(a);
for(int i = 0; i<a.length-1; i++) {
	for(int j=i+1; j<a.length; j++) {
	    if(a[i] == a[j]) {
	    break ;
	    }
		if(a[i] != a[j] && j == a.length -1) {
		result ++ ;
		}
	}
}

System.out.println(result + 1) ;
}
public static void main(String[] args) {
Scanner input = new Scanner (System.in) ;
int num = input.nextInt();
int [] arr =  new int [num]  ;
for(int i=0; i<arr.length; i++) {
	arr[i] = input.nextInt();
}
getNum(arr) ;
}
}

在这里插入图片描述
第八题(当时没时间做,后面做出来的)

/*
 *问题描述
  小明想知道,满足以下条件的正整数序列的数量:
  1. 第一项为 n;
  2. 第二项不超过 n;
  3. 从第三项开始,每一项小于前两项的差的绝对值。
  请计算,对于给定的 n,有多少种满足条件的序列。
输入格式
  输入一行包含一个整数 n。
输出格式
  输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入
4
样例输出
7
样例说明
  以下是满足条件的序列:
  4 1
  4 1 1
  4 1 2
  4 2
  4 2 1
  4 3
  4 4
评测用例规模与约定
  对于 20% 的评测用例,1 <= n <= 5;
  对于 50% 的评测用例,1 <= n <= 10;
  对于 80% 的评测用例,1 <= n <= 100;
  对于所有评测用例,1 <= n <= 1000。
 */
import java.util.Scanner ;
public class Main {
public static int [][] arr ; //预先不能分配存储空间,所以现在类中定义
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int n = input.nextInt();
arr = new int [n+1][n+1] ;
int sum = 0 ;
for(int i=1; i<=n; i++) {
   sum += getResult(n,i) ; //当i为第二个数字的时候依次累加,求出最终结果
}
System.out.println(sum % 10000) ;
}
public static int getResult(int n, int m) {//形参n是第一个数,形参m是不大于n的第二个数字
	int result = 1 ;
	for(int i=1; i<Math.abs(n - m); i++) {
		result = (result + getResult(m,i)) % 10000 ;//此时m变成第二个数字,i变成第三个数字,依次类推
	}
	return result ;
}
}

第九题(应该是搜索算法)
没时间做

第十题
思路:其实就是把数组元素由小到大排序,逆序后,将最大的m个元素存放到新的数组中,此时就是选择的节目 ,但是选择的节目顺序不能乱,将原数组的元素依次与新数组对比,一样则打印,便得到正确顺序的最好看的节目播放次序。


/*
  问题描述
  小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
  这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
  小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
  小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
输入格式
  输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
  第二行包含 n 个整数,依次为每个节目的好看值。
输出格式
  输出一行包含 m 个整数,为选出的节目的好看值。
样例输入
5 3
3 1 2 5 4
样例输出
3 5 4
样例说明
  选择了第1, 4, 5个节目。
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 20;
  对于 60% 的评测用例,1 <= n <= 100;
  对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。
 */
import java.util.Scanner ;
import java.util.Arrays;
public class Main {
public static void findNum(int [] a, int num) {
int [] newarr = new int [a.length] ;
int [] arr = new int [num] ;
int [] result = new int [a.length] ;
for(int i=0; i<a.length; i++) {
	result[i] = a[i] ;
}
	Arrays.sort(a);
	int j = 0 ;
for(int i=a.length-1; i>=0; i--) {
	newarr[j] = a[i] ;
	j ++ ;
}
int flag = 0 ;

for(int i=0; i<arr.length; i++) {
	arr[i] = newarr[i] ;
	flag ++ ;
	if (flag == num) {
		break ;
	}
}
for(int i=0; i<result.length; i++) {
for(int k=0; k<arr.length; k++) {
	if(result[i] == arr[k]) {
		System.out.print(arr[k] + " ") ;
	}
}
}
}
public static void main(String[] args) {
Scanner input = new Scanner (System.in) ;
int num1 = input.nextInt();
int num2 = input.nextInt();
int [] arr = new int [num1] ;
for(int i=0; i<num1; i++) {
   arr[i] = input.nextInt();
}
findNum(arr,num2) ;
}
}

运行结果如下
在这里插入图片描述

发布了45 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/105027173