在Java中,以下关于方法重载和方法重写描述正确的是?
A 方法重载和方法的重写实现的功能相同
B 方法重载出现在父子关系中,方法重写是在同一类中
C 方法重载的返回值类型必须一致,参数项必须不同
D 方法重写的返回值类型必须相同或相容。
解析: D
重载 : 方法名一致,形参列表不同。无所谓返回值多少,不作为判断依据。
重写:两同,两小,一大。 方法名和形参列表相同,子类的返回值类型和异常类型必须是父类对应的类型或者其字类型,子类的访问权限必须大于父类。
题目1:计算日期到天数转换
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while (sc.hasNext()){
int y= sc.nextInt();
int m = sc.nextInt();
int d = sc.nextInt();
int sum = 0;
int [] day = {31,59,90,120,151,181,212,243,273,304,334,365};
if (m>=2){
sum += day[m-2];
}
sum += d;
if (m>2){
if (y%400==0 || y%4==0&&y%100!=0){
sum += 1;
}
}
System.out.println(sum);
}
}
}
题目2:幸运袋子
- 递归+回溯
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i <n ; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
int num = count(a,n,0,0,1);
System.out.println(num);
}
}
private static int count(int[] a, int n, int pos, int sum, int multi) {
int count = 0;
for (int i = pos; i <n ; i++) {
sum += a[i];
multi *= a[i];
if (sum > multi){
count = count +1 + count(a,n,i+1,sum,multi);
}else if (a[i]==1){
count = count + count(a,n,i+1,sum,multi);
}else {
break;
}
sum = sum -a[i];
multi = multi/a[i];
while (i<n-1 && a[i]==a[i+1]){
i++;
}
}
return count;
}
}
总结:
1.将袋子里面球的号码排序
2.当一个号码和前面的号码无法组成幸运袋子,那就直接break,因为后面的号码肯定比前面号码数字大或者等于,也无法构成幸运的袋子
3.当我们返回上层递归的时候,需要回溯,继续计算前面的号码和当前位置后面的号码是否可以构成幸运的袋子
特殊情况 a[i] == 1 1和任何数都大于它和他的乘积