目录

1.15.125GB

2.约数个数

3.叶结点数

4.数字9

 解法一

 解法二

 5.数位递增的数

解法一

解法二

6.递增三元组

 解法一

解法二

7.音节判断

解法一(正则表达式) 

解法二

8.长草

9.序列计数

10.晚会节目单


1.15.125GB

在计算机存储中,15.125GB是多少MB?

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

【答案】15488

【解析】1GB=1024MB

15.125GB=15.125*1024MB=15488MB

2.约数个数

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

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

【答案】96

public class Main {
	public static void main(String[] args) {
		int count = 0;
		int n=1200000;
		for(int i=1;i<=n;i++) {
			if(n%i==0) {
				count++;
			}
		}
		System.out.println(count);
	}
}

3.叶结点数

【问题描述】一棵包含有2019个结点的二叉树,最多包含多少个叶结点?

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

 【解析】用二叉树的公式,(2019+1)/2=1010

【答案】1010

4.数字9

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

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

【答案544】

 解法一

暴力破解,在1至2019中,含有9的数字可以分为

包含3个9:x999

包含2个9:xx99、x99x、x9x9

包含1个9:x9xx、xx9x、xxx9

public class Main {
	public static void main(String[] args) {
		int count=0;
		for(int i=1;i<=2019;i++) {
			int g = i % 10;//个位数字
			int s = i / 10 % 10;//十位数字
			int b = i / 100 % 10;//百位数字
			//x999
			if(b==9 && s==9 && g==9)
				count++;
			
			//xx99
			if(b!=9 && s==9 && g==9)
				count++;
			//x99x
			if(b==9 && s==9 && g!=9)
				count++;
			//x9x9
			if(b==9 && s!=9 && g==9)
				count++;
			
			//x9xx
			if(b==9 && s!=9 && g!=9)
				count++;
			//xx9x
			if(b!=9 && s==9 && g!=9)
				count++;
			//xxx9
			if(b!=9 && s!=9 && g==9)
				count++;
		}
		System.out.println(count);
	}
}

 解法二

将数字转为字符串,如果字符串中包含“9”,则count++。


public class Main { 
    public static void main(String []args){
        int count=0;
        for(int i=1;i<=2019;i++){
            String str = i+""; //将数字转为字符串
            if(str.contains("9")){ //如果字符串中包含9,count++
                count++;
            }
        }
        System.out.println(count);
    }
}


 5.数位递增的数

【问题描述】一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。

给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?

【输入格式】输入的第一行包含一个整数 n。

【输出格式】输出一行包含一个整数,表示答案。

【样例输入】30

【样例输出】26

【评测用例规模与约定】对于 40% 的评测用例,1 <= n <= 1000。

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

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

解法一


import java.util.Scanner;

public class Main {
	public static int n,count=0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		f(0,1);
		System.out.println(count-1);
	}

	private static void f(int num, int temp) {
		if(num>=n)
			return;
		count++;
		for(int i=temp;i<10;i++) {
			f(num*10+i,i);
		}
	}
}


解法二


import java.util.Scanner;
public class Main {
	public static boolean test(int n) {
    String s=String.valueOf(n);
    	for(int i=0;i<s.length()-1;i++) {
//若此数的第i位大于第i+1位则说明此数为非递增数则返回false
    		if(s.charAt(i)>s.charAt(i+1)) {
    			return false;
    		}
        }
        return true;
    }
	public static void main(String[] args) {
		int count=0;
		Scanner sc=new Scanner(System.in);
		int num=sc.nextInt();
		for(int i=1;i<=num;i++) {//遍历1至num
			if(test(i)) {//若该数为递增数则计数
				count++;
			}
		}
		System.out.println(count);//输出总数
	}
}


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。

 解法一


import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[] a = new int[n];
		int[] min = new int[n];
		int[] max = new int[n];
		for (int i = 0; i < n; i++)
			a[i] = in.nextInt();
		min[0] = a[0];
		max[n - 1] = a[n - 1];
		for (int i = 1; i < n; i++) {
			min[i] = Math.min(a[i], min[i - 1]);
		}
		for (int i = n - 2; i >= 0; i--) {
			max[i] = Math.max(a[i], max[i + 1]);
		}
		int count = 0;
		for (int i = 1; i < n - 1; i++) {
			if (a[i] > min[i - 1] && a[i] < max[i + 1]) {
				count++;
			}
		}
		System.out.print(count);
	}
}


解法二


public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] a = new int[n];
		for (int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}
		int count=0;
		for (int i = 0; i < n-2; i++) {
			for (int j = i+1; j < n-1; j++) {
				for (int k = j+1; k <n; k++) {
					if (a[i] < a[j] && a[j] < a[k]) {
						count++;
						a[j]=0;
						break;
					}
				}
			}
		}
		System.out.println(count);
	}
}


7.音节判断

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

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

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

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

【输出格式】输出答案,或者为yes,或者为no。

【样例输入】lanqiao

【样例输出】yes

【样例输入】world

【样例输出】no

【评测用例规模与约定】对于所有评测用例,单词中的字母个数不超过100。

解法一(正则表达式) 

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	//[^aeiou]+表示一个或者多个非元音字母
	static Pattern p = Pattern.compile("[^aeiou]+[aeiou]+[^aeiou]+[aeiou]+");
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		if(test(s)) 
			System.out.println("yes");
		else
			System.out.println("no");
	}
	private static boolean test(String s) {
		Matcher m = p.matcher(s);
		return m.matches();
	}
}

解法二

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char []c = sc.next().toCharArray();
/*j代表下标,count代表段与段之间,
 * 比如从一段到二段,count++,二段到三段count++,
 * 三段到四段count++,最终count为3*/
        int j=0,count=0; 
        for(int i=1;i<=4;i++){ //i代表第几段
            for(;j<c.length;){
                if(i==1||i==3){//一段和三段时应当为辅音
                    if(c[j]!='a'&&c[j]!='e'&&c[j]!='i'&&c[j]!='o'&&c[j]!='u'){//辅音
                        j++;//为辅音j+1并continue判断j+1
                        continue;
                    }else{
                        count++;
                        break;//不为辅音下标j不变并跳入下一段
                    }
                }
                if((i==2||i==4)&&j!=0){//二段和四段时应当为元音,并且下标不能为0
                    if(c[j]=='a'||c[j]=='e'||c[j]=='i'||c[j]=='o'||c[j]=='u'){//元音
                        j++;//为元音j+1并continue判断j+1
                        continue;
                    }else{
                        count++;
                        break;//不为元音下标j不变并跳入下一段
                    }
                }
            }
        }
        if(count==3){
            System.out.println("yes");
        }else{
            System.out.println("no");
        }
    }
}

8.长草

 【问题描述】小明有一块空地,他将这块空地划分为 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。

import java.util.Scanner;
public class Main {
	static int n,m,k;
	static char[][]map;
	static char[][]vis;
	static int[]dx= {0,1,0,-1};
	static int[]dy= {-1,0,1,0};
	public static void dfs(int x,int y,int k) {
		if(k==0) {
			return;
		}
		for(int i=0;i<4;i++) {
			int nx=x+dx[i];
			int ny=y+dy[i];
			if(nx>=0&&nx<=n-1&&ny>=0&&ny<=m-1) {//递归边界,不能出界
				vis[nx][ny]='g';//若可到达则将此地“长草”
				dfs(nx,ny,k-1);//继续递归,同时k-1
			}
		}
	}
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		n=sc.nextInt();//输入行
		m=sc.nextInt();//输入列
		map=new char[n][m];//为地图数组分配空间
		vis=new char[n][m];//为访问数组分配空间
		for(int i=0;i<n;i++) {
			String s=sc.next();
			for(int j=0;j<m;j++) {
				map[i][j]=s.charAt(j);//输入地图
				vis[i][j]=s.charAt(j);//将地图数组的数据也复制一份给vis访问数组
			}
		}
		k=sc.nextInt();//输入k个月
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(map[i][j]=='g') {//哪处有草就从哪开始遍历
					dfs(i,j,k);
				}
			}
		}
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) 
				System.out.print(vis[i][j]); //输出vis数组
			System.out.println();
        }
	}
}

9.序列计数

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

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

		return map[x][y];
	}
}

10.晚会节目单

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

对于所有评测用例,1<= n <= 100000,0 <= 节目的好看值<= 100000。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[] a = new int [n];
		int[] b = new int [n];
		for(int i=0;i<n;i++) {
			a[i] = sc.nextInt();
			b[i] = a[i];
		}
		sc.close();
		Arrays.sort(b);
		ArrayList<String> list = new ArrayList<String>();
		for(int i = n-m;i < n;i++) {
			list.add(b[i]+"");
		}
		StringBuilder sb = new StringBuilder("");
		for(int i:a) {
			if(list.contains(i+"")) {//List的contains()用于判断对象是否存在于列表中
				list.remove(i+"");//删除元素
				sb.append(i+" ");//append()是向string的后面追加字符或字符串。
			}
		}
		System.out.println(sb);
	}
}

list的contains()用于判断对象是否存在于列表中。

 list的remove()删除元素。

append()是向string的后面追加字符或字符串。