模拟赛时长四个小时,本菜鸟只做出来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) ;
}
}
运行结果如下