Java 第十一届校内模拟真题

第十一届校内模拟真题

15.125GB

【问题描述】
在计算机存储中,15.125GB是多少MB?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,
填写多余的内容将无法得分。
【答案】15488.0
【代码】

      public static void main(String[] args) {
		System.out.println(15.125*1024);
	}

【输出】
15488

约数个数

【问题描述】
1200000有多少个约数(只计算正约数)。

【答案提交】
这是一道结果填空的题,
你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,
填写多余的内容将无法得分。
【答案】96
【分析】
什么使约数?
约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
4的正约数有:1、2、4。
6的正约数有:1、2、3、6。
10的正约数有:1、2、5、10。
12的正约数有:1、2、3、4、6、12。
15的正约数有:1、3、5、15。
【代码】

        public static void main(String[] args) {
		System.out.println(fun(1200000));
	}
	// 返回约束的个数
	public static int fun(int num) {
		int count=0;
		for(int i=1;i<=num;i++) {
			if(num%i==0) {
				count++;
			}
		}
		return count;
	}

【输出】
96

叶结点数

【问题描述】一棵包含有2019个结点的二叉树,
最多包含多少个叶结点?
【答案提交】这是一道结果填空的题,
你只需要算出结果后提交即可。本题的结果为一个整数,
在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】1010
【分析】
二叉树什么时候出现最多的叶结点的情况?
在完全二叉树的情况下可以得到最多的叶子节点。
叶子节点最多的个数与节点总数的奇偶有关,奇数个则有(n-1)/2+1个
偶数个则有n/2个。
【代码】
小编写的时候不知道这个公式,所以暴力破解

      public static void main(String[] args) {
		double sum = 0;
		for(double i=0;i<2019;i++) {
			if(sum>=2019) {
				break;
			}
			sum = sum+ Math.pow(2,i);
			System.out.println("该层有节点"+Math.pow(2,i)+"个---------------"+"树的层数"+(i+1)+"总计:"+sum);
		}
		System.out.println(1024-(2047-2019)/2);
	}

【输出】
该层有节点1.0个---------------树的层数1.0总计:1.0
该层有节点2.0个---------------树的层数2.0总计:3.0
该层有节点4.0个---------------树的层数3.0总计:7.0
该层有节点8.0个---------------树的层数4.0总计:15.0
该层有节点16.0个---------------树的层数5.0总计:31.0
该层有节点32.0个---------------树的层数6.0总计:63.0
该层有节点64.0个---------------树的层数7.0总计:127.0
该层有节点128.0个---------------树的层数8.0总计:255.0
该层有节点256.0个---------------树的层数9.0总计:511.0
该层有节点512.0个---------------树的层数10.0总计:1023.0
该层有节点1024.0个---------------树的层数11.0总计:2047.0
1010

数字9

【问题描述】在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。
例如,1999这个数包含数字9,在计算只是算一个数。
【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】544
【分析】
将整型转为字符串型,利用String api的indexOf(),当一个数中没有出现字符9,返回-1
【代码】

      public static void main(String[] args) {
		int count = 0;
		for(int i=1;i<=2019;i++) {
			if(String.valueOf(i).indexOf('9')!=-1) {
				count++;
			}
		}
		System.out.println(count);
	}

【输出】544

位数递增的数

【问题描述】一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】输入的第一行包含一个整数 n。

【输出格式】输出一行包含一个整数,表示答案。
【样例输入】30【样例输出】26
【评测用例规模与约定】对于 40% 的评测用例,1 >= n >= 1000。对于 80% 的评测用例,1 >= n >= 100000。对于所有评测用例,1 >= n >= 1000000。
【分析】首先想到的是指针指向整数的第一位,第一位与后一位进行比较。后来又想到可以用递归的方法,没想出来,于是借鉴了别人的代码
【代码】
非递归

      public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		System.out.println(fun(n));
	}
	public static int fun(int n) {
		int count = 0;
		boolean flag = true;
		for(int i=1;i<=n;i++) {
			flag = true;
			String numString = String.valueOf(i);
			for(int j=0;j<numString.length()-1;j++) {
				if(!(numString.charAt(j)<=numString.charAt(j+1))) {
					flag = false;
					break;
				}
			}
			if(flag) {
				count++;
			}
		}
		return count;
	}

递归

      public static int n=0;
	public static int count = 0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		sc.close();
		fun(0,1);
		System.out.println(count-1);
	}
	public static int fun(int num,int temp) {
		// num 这个数,temp是位数
		if(num>n) {
			return 0;
		}else {
			count++;
		}
		for(int i=temp;i<10;i++) {
			fun(num*10+i,i);
		}
		return count;
	}

递增三元组

【问题描述】
在数列 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。
【代码】

      public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int a[] = new int[n];
		for (int i = 0; i < a.length; i++) {
			a[i] = scan.nextInt();
		}
		int num = fun(a);
		System.out.println(num);
	}

	public static int fun(int a[]) {
		int num = 0;
		boolean flag = false;
		for(int j = 1;j<a.length-1;j++) {
			flag = false;
			for(int i=0;i<j;i++) {
				for(int k=j+1;k<a.length;k++) {
					if(a[i]<a[j]&&a[j]<a[k]) {
						num++;
						flag = true;
						break;
					}
				}
				if(flag) {
					break;
				}
			}
		}
		return num;
	}

音节判断

【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【输入格式】
输入一行,包含一个单词,单词中只包含小写英文字母。
【输出格式】
输出答案,或者为yes,或者为no。
【样例输入】
lanqiao
【样例输出】
yes
【样例输入】
world
【样例输出】
no
【评测用例规模与约定】
对于所有评测用例,单词中的字母个数不超过100。

      public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		if (fun(str)) {
			System.out.println("yes");
		} else {
			System.out.println("no");
		}

	}

	public static boolean fun(String str) {
		char chs[] = str.toCharArray();
		String yuanyin = "aeiou";
		int flag = 0;
		for (int i = 0; i < chs.length; i++) {
			if (flag % 2 == 0 && !yuanyin.contains(String.valueOf(chs[i]))) {
				flag++;
			} else if (flag % 2 != 0 && yuanyin.contains(String.valueOf(chs[i]))) {
				flag++;
			}
		}
		if (flag == 4) {
			return true;
		}
		return false;
	}

长草

【问题描述】
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
【输出格式】
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
【样例输入】
4 5
.g...
.....
..g..
.....
2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

        public static int[][] bool;
	public static int k = 0, n = 0, m = 0;
	public static char block[][];
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		m = scan.nextInt();
		bool = new int[n][m];
		block = new char[n][m];
		for (int i = 0; i < n; i++) {
			char temp[] = scan.next().toCharArray();
			for (int j = 0; j < m; j++) {
				block[i][j] = temp[j];
			}
		}
		k = scan.nextInt();
		fun(block, k);
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				System.out.print(block[i][j]);
			}
			System.out.println();
		}
	}

	public static void fun(char block[][], int k) {
		while (k > 0) {
			for (int i = 0; i < block.length; i++) {
				for (int j = 0; j < block[i].length; j++) {
					if (block[i][j] == 'g')
						bool[i][j] = 1;
				}
			}
			for (int i = 0; i < bool.length; i++) {
				for (int j = 0; j < bool[i].length; j++) {
					if (bool[i][j] == 1) {
						if (i - 1 >= 0) {
							block[i - 1][j] = 'g';
						}
						if (i + 1 < block.length) {
							block[i + 1][j] = 'g';
						}
						if (j - 1 >= 0) {
							block[i][j - 1] = 'g';
						}
						if (j + 1 < bool[i].length) {
							block[i][j + 1] = 'g';
						}
					}
				}
			}
			k--;
		}
	}

序列计数

【问题描述】
小明想知道,满足以下条件的正整数序列的数量:

  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。
      public static int n=0,count=0;
	public static int [] []map ;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		 n =sc.nextInt();
		 sc.close();
		 map = new int [n+1][n+1];
		 for (int i = 1; i <=n; i++) {
			map[i][i]=1;
			map[i][0]=1;
			map[0][i]=1;
		}
		 for (int i = 1; i <=n; i++) {
			count+=f(n,i);
			count%=10000;
//			System.out.println(count);
		}
		 System.out.println(count);
//		 System.out.println(f(4,2));
		 
	}
	public static int f(int x,int y){
		if(map[x][y]!=0){
			return map[x][y];
		}
		for (int i = Math.abs(x-y)-1; i>=0; i--) {
			map[x][y]+=f(y,i);
		}
		map[x][y]%=10000;
//		map[y][x]=map[x][y];
//		System.out.println();
		return map[x][y];
	}

晚会节目单

【问题描述】
小明要组织一台晚会,总共准备了 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。

      public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[] num = new int[n];
		int[] order = new int[n];
		for (int i = 0; i < n; i++) {
			num[i] = sc.nextInt();
			order[i] = num[i];
		}
		sc.close();
		Arrays.sort(order);
		ArrayList<String> list = new ArrayList<String>();
		for (int i = n - m; i < n; i++) {
			list.add(order[i]+"");
		}
		StringBuilder sb = new StringBuilder("");
		for (int i : num) {
			if (list.contains(i+"")) {
				list.remove(i+"");
				sb.append(i + " ");
			}
		}
		System.out.println(sb);
	}
posted @ 2020-07-27 16:54  等风吹来  阅读(215)  评论(0)    收藏  举报