Day4
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
//闰年规则: 能被400整除,或者能被4整除但是不能被100整除。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份(四年年份):");
int year = scanner.nextInt();
System.out.println("请输入月(1~12):");
int month = scanner.nextInt();
System.out.println("请输入日期(1~31):");
int date = scanner.nextInt();
int[] md = {31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数
int sumday = 0;
//month = 4 找前四个月的天数数据进行累加
for (int i = 0; i < month - 1; i++) { // 1。i控制循环的次数 2.i作为数组的下标使用
sumday = sumday + md[i];
}
sumday = sumday + date; //加上输入月对应的天数
//如果是闰年,并且输入的月份大于2,那么再加上1 因为闰年的2月有29天。
if (isRunYear(year) && month > 2){
sumday = sumday + 1;
}
boolean flag = isRunYear(year);
if (flag) {
System.out.println(year+"是闰年");
}else {
System.out.println(year+"不是闰年");
}
System.out.println(year+"年"+month+"月"+date+"日,是本年的第"+sumday+"天。");
}
//定义函数,判断是否为闰年
public static boolean isRunYear(int year){
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
return true;
}else{
return false;
}
}
运行结果:
题目:将一个数组逆序输出。
分析:用第一个与最后一个交换。
只输出,可以选择最后一个往第一个输出把数组中的数据逆序:用第一个与最后一个交换,第二个和倒数第二个交换
public static void main(String[] args) {
int[] arr = new int[10];
for(int i = 0; i < 10; i++) {
arr[i] = (int)(Math.random()*100)+1;
}
System.out.println("----------正序输出----------");
System.out.println(Arrays.toString(arr));
System.out.println("----------逆序输出----------");
for(int i = arr.length-1; i > 0; i--) {
System.out.print(arr[i]+" ");
}
System.out.println();
//修改数组逆序
for(int j = 0; j < arr.length-1; j++) {
//交换位置
int temp = arr[j];
arr[j] = arr[arr.length-1-j];
arr[arr.length-1-j] = temp;
}
System.out.println(Arrays.toString(arr));
//再修改数组逆序
for(int i = 0; i < arr.length/2; i++) {//arr.length/2 ,使得循环次数变少
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
System.out.println(Arrays.toString(arr));
}
运行结果:
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
public static void main(String[] args) {
//自定义一个数组
int[] arr = {1, 19, 80, 76, 38, 70, 55, 69, 22};
int max_index = 0;
int min_index = 0;
System.out.println("原数组:\n"+Arrays.toString(arr));
for(int i = 1; i < arr.length; i++) {//从第2个数开始比较
if(arr[i] > arr[max_index]) {//如果后面个比前面一个数大,那么就记录后面个数的索引位置
max_index = i;//记录这一次比较中的较大数索引位置
}
}//循环结束后,会找到数组中最大数据的下标位置
//接下来我们通过临时变量来交换数据
int temp = arr[0];//取出第 1 个数据
arr[0] = arr[max_index];//将最大数与第一个元素交换
arr[max_index] = temp;//交换完成
//最小数据同理可得
for(int i = 1; i < arr.length; i++) {
if(arr[i] < arr[min_index]) {
min_index = i;
}
}
temp = arr[arr.length-1];
arr[arr.length-1] = arr[min_index];
arr[min_index] = temp;
//输出交换后的数组
System.out.println("输出交换后的数组:\n"+Arrays.toString(arr));
}
运行结果:
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
分析:意思每个元素都往后移动 m 次
public static void main(String[] args) {
int[] a = {1, 19, 80, 76, 38, 70, 55, 69, 22}; //自定义
int m = 3;
System.out.println("原数组:\n"+Arrays.toString(a));
for(int i = 1; i <= m; i++) {//外层循环控制移动次数
int last = a[a.length-1];//保存最后一个数据
for(int j = a.length-2; j >= 0 ; j--) {//内层循环控制数组中每个元素向后移动一位
a[j+1] = a[j];
}
a[0] = last;//放回第一位
}
System.out.println("移动后数组:\n"+Arrays.toString(a));
}
运行结果:
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
public static void main(String[] args) {
int[] a = {1,3,5,7,9,11};
int x = 6;//需要插入的数
int[] b = new int[a.length+1];//创建一个比原数组多 1 的新数组
int index = 0; //下标记录
System.out.println("原数组:"+Arrays.toString(a));
for(int i = 0; i < a.length; i++) {
if(x > a[i]) {//如果需插入的数比i位置的大,说明i位置不合适,i原地不动
b[i] = a[i];
}else {//否则比 i 小,说明这一个位置是合适的,记录该位置
index = i;
b[i] = x;//满足插入条件,插入
break;//结束循环
}
}
//现在还剩a.length-index个元素需处理
for(int i=index; i <a.length; i++) {
b[i+1] = a[i];//旧放新
}
System.out.println("插入后的数组:"+Arrays.toString(b));
}
运行结果:
另一种实现:
public static void main(String[] args) {
int[] a = {1,3,5,7,9,11};
int x = 6;//需要插入的数
a = Arrays.copyOf(a, a.length+1);//是原数组长度加 1
int index = 0; //下标记录
System.out.println("原数组:"+Arrays.toString(a));
for(int i = 0; i < a.length; i++) {
//先通过条件判断找到可以插入的合适下标位置
if(x < a[i]) {
index = i;
break;
}
}
for(int i = a.length-1; i > index; i--) {
//倒数第二个往倒数第一个挪
a[i] = a[i-1];
}
//挪完之后索引位置会空出,此时将待插入数据放入即可
a[index] = x;
//输出数组
System.out.println("插入后的数组:"+Arrays.toString(a));
}
运行结果: