目录
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 <= 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的后面追加字符或字符串。