从古至今,各种末日谣言层出不穷。假如现在有这样一个谣言:天文学家在2014年6月1日,发现一颗行星,根据该行星的运行轨道,在3000天以后,该行星将撞击地球。现在,请编写Java程序计算,该谣言指向的“世界末日”是哪一天?
要求输出格式为:xxxx-xx-xx(例如:2015-12-12),不要添加任何其他多余文字。
输入描述:无
输出描述:
计算的结果日期,格式为:xxxx-xx-xx
输入样例:无
输出样例:
2015-12-12
参考代码:
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // 格式化
Calendar c = Calendar.getInstance();
c.set(2014, 5, 1); // 开始日期,注意月份是从0开始的
c.add(Calendar.DAY_OF_YEAR, 3000);// 向后推3000天
System.out.println(df.format(c.getTime()));
}
}
由1到n的平方个数字组成的n×n阶方阵(n为任意给定的一个不小于3的奇数),它的每行、每列及对角线上的数字和都相等,称为n阶魔方阵。它的每行、每列及对角线上的数字和为n×(n² + 1) / 2。该方阵的排列方法是:
(1) 将数字1放在第一行的中间位置上,即(0,n/2)位置;
(2) 下一个数放在当前位置(i, j)的上一行(i-1)、下一列(j-1),即当前位置的右上方;如果出现以下情况,则修改填充位置:
① 若当前位置是第一行,下一个数放到最后一行,即把i-1修改为n-1;
② 若当前位置是最后一列,下一个数放在第一列,即把j-1修改为n-1;
③ 若下一个数要放的位置已经有数字,则下一个数放在当前位置的下一行,相同列。
(3) 重复以上过程,直到n²个数字不重复的填入方阵中。
根据以上描述,请使用Java语言,设计一个程序,输出n阶魔方阵。
输入描述:
一个大于等于3的奇数n,不建议太大,3-9即可
输出描述:
一个n*n的数字矩阵,每行的数字之间采用一个制表符"\t"分隔
输入样例:
3
输出样例:
8 1 6 3 5 7 4 9 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[][] magic = new int[n][n];
int i = 0, j = n / 2; // 第一个数位置
for (int k = 1; k <= n * n; k++) {
magic[i][j] = k; // 当前位置
if (k % n == 0) { // 下一位有数字
i = (i + 1) % n; // 下一位在下一行
} else {
i = (i - 1 + n) % n; // 在没到边界时,每次i减一,+n为了防止出现负数
j = (j + 1) % n; // 每n个数换一列
}
}
// 输出二维数组
for (int k = 0; k < magic.length; k++) {
for (int l = 0; l < magic[k].length; l++) {
System.out.print(magic[k][l] + "\t"); // 输出不换行,用制表符分隔
}
System.out.println(); // 换行
}
}
}
从前,某国王在处决500名死囚犯时突发奇想,想赦免其中的一个人,于是他把这500个死囚犯从1到500编号,都放到一片空地上,让大家手牵手组成一个大环。从1号开始报数,凡是报数为3的倍数的人就要被杀掉,每轮过后,剩下的人组成一个较小的环,继续报数(注意,上一轮最后一人报数后,下一轮的第一个人要继续往下报,而不是重新从1开始),直到剩下最后一个人为止。请编写程序计算,最终这个幸运的人是几号?
输入描述:无
输出描述:
一个整数,表示最终活下来的人员编号
输入样例:无
输出样例:
55
参考代码:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
for(int i = 1; i <= 500; i++) {
list.add(i);
}
int count = 1;
for (int i = 0; list.size() != 1; i++) {
if (i == list.size()) {
i = 0;
}
if (count % 3 == 0) {
list.remove(i--);
}
count++;
}
System.out.println(list.get(0));
}
}
给定一个正整数m(m最小是一个两位数),现在想从组成m这个数的数字中,去掉其中的n个数字(0 < n < m的位数),但保持每位上的数字相对顺序不变,使得剩余的数字组成的数是最大值。例如:
当m = 51342,n = 1;则结果应该是去掉数字1,剩余的值最大,为5342;
当m = 51342,n = 2;则结果应该是去掉数字1、3,剩余的值最大,为542;
当m = 51342,n = 3;则结果应该是去掉数字1、3、2,剩余的值最大,为54;
请使用Java语言编程,实现该算法。其中的m和n按要求输入正确范围内的数字即可,无需做合法校验。
输入描述:
第一行输入正整数m(m >= 10) 第二行输入去掉的数字个数n(0 < n < m的位数)
输出描述:
去掉n个数字后的最大值
输入样例:
51342 2
输出样例:
542
参考代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long m = sc.nextLong();
int n = sc.nextInt(); // 去除的数字个数
String s = String.valueOf(m);
for (int i = 0; i < n; i++) {
int index = 0;
for (int j = 0; j < s.length() - 1; j++) {
if (s.charAt(j) < s.charAt(j + 1)) {
index = j; // 左边小于右边,就去掉这个左边的
break;
}
if (j == s.length() - 2) {
index = j + 1; // 去掉最小的
}
}
if (index == s.length() - 1) {
s = s.substring(0, s.length() - 1);
} else {
s = s.substring(0, index).concat(s.substring(index + 1));
}
}
System.out.println(Integer.parseInt(s));
}
}
小智拿到一个数列{a1, a2, ..., an},现在他想从这个数列中取出若干数,组成一个新的数列{ai1, ai2, ..., aim},其中索引i1, i2, ..., im保持递增,也就是说数列中各个数仍然保持在原数列中的先后顺序。并且在新数列中,对于任意索引ix > iy,都有aix > aiy,也就是说新数列是一个递增的子序列。
请编写程序,求出符合上述要求的最长递增子序列的长度。
例如数列[1, 3, 6, 7, 9, 4, 10, 5, 6],最长递增子序列为[1, 3, 6, 7, 9, 10],长度是6。
输入描述:
任意个数的整数,中间使用空格分隔
输出描述:
个整数,表示符合题目要求的最长子序列的长度
输入样例:
1 3 6 7 9 4 10 5 6
输出样例:
6
参考代码:
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String[] strs = line.split(" ");
int[] arr = new int[strs.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(strs[i]);
}
int[] dp = new int[arr.length];
dp[0] = 1;
for (int i = 1; i < arr.length; i++) {
// 关系状态方程:dp[i]=max{dp[j]+1(0<=j= 0; j--) {
if (arr[j] < arr[i] && dp[j] > max) {
max = dp[j];
}
}
dp[i] = max + 1;
}
Arrays.sort(dp);
System.out.println(dp[dp.length - 1]);
}
}
转载至: https://www.yuque.com/docs/share/121253a1-4d4f-4a45-88a6-83fe9e5e1fd1