今日算法题
题目一:字母图形
问题描述:
利用字母可以组成一些美丽的图形,下面给出了一个例子:(时间限制:1.0s,内存限制:256.0MB,1 <= n, m <= 26)
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入、输出格式:
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出n行,每个m个字符,为你的图形。
解决思路:
1.先找出图形的规律:可以把这看成是由两节字符串拼凑而成的
"" + "ABCDEFG"
"B" + "ABCDEF"
"CB" + "ABCDE"
"DCB" + "ABCD"
"EDCB" + "ABC"
2.这两节字符串就可以分别从英文字母表的正序和倒序截取。
解决代码:
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(); // 行数
String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String s2 = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
for(int i = 0; i < n; i++) {
if(m > i)
System.out.println(s2.substring(s2.length()-1-i, 25) + s1.substring(0, m-i));
else
System.out.println(s2.substring(s2.length()-1-i, 25).substring(0,m));
}
}
}
题目二:01字串
问题描述:
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:(时间限制:1.0s,内存限制:256.0MB)
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
输入、输出格式:
无输入
输出32行,按从小到大的顺序每行一个长度为5的01串。
解决思路:
1.首先忽略掉输出结果前的0,不难看出这就是0-31的二进制表示形式。
2.接下来需要解决如何添加输出结果前的0的问题,经过分析可知,最多在结果前添加4个0,而最少就是不添加,于是可以不管输出结果全部统一加上4个0,最后再用字符串截取最后5位即可。
解决代码:
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 32; i++) {
String s = "0000" +Integer.toBinaryString(i);
System.out.println(s.substring(s.length() - 5, s.length()));
}
}
}
题目三:数列特征
问题描述:
给出n个数,找出这n个数的最大值,最小值,和。(时间限制:1.0s,内存限制:256.0MB,1 <= n <= 10000)
输入、输出格式:
第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
解决思路:
求一组数的最大最小值排序即可。
解决代码:
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[] arr = new int[n];
int sum = 0;
for(int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
sum += arr[i];
}
Arrays.sort(arr);
System.out.println(arr[n-1]);
System.out.println(arr[0]);
System.out.println(sum);
}
}
题目四:闰年判断
问题描述:
给定一个年份,判断这一年是不是闰年。(时间限制:1.0s,内存限制:256.0MB,1990 <= y <= 2050)
当以下情况之一满足时,这一年是闰年:
-
年份是4的倍数而不是100的倍数;
-
年份是400的倍数。
其他的年份都不是闰年。
输入、输出格式:
输入包含一个整数y,表示当前的年份。
输出一行,如果给定的年份是闰年,则输出yes,否则输出no。
解决代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
if(year % 4 == 0 && year % 100 != 0) {
System.out.println("yes");
}
else if(year % 400 == 0) {
System.out.println("yes");
}
else
System.out.println("no");
}
}