目录
一、选择题
二、编程题
1、有假币
一、选择题
重点复习选择题4,8,10。
问题4:
类方法:又称为静态方法。而实例方法不能加static,又叫非静态方法。
类方法和实例方法的区别_类方法和实例方法区别_及可不遥的博客-CSDN博客
(1)A错误,类的实例方法是与该类的实例对象相关联的,不能直接调用,只能通过创建超类的一个实例对象,再进行调用。
(2)B错误,当父类的类方法定义为private时,对子类是不可见的,所以子类无法调用。
(3)C错误,子类具体的实例方法对父类是不可见的,所以无法直接调用, 只能通过创建子类的一个实例对象,再进行调用。
(4)D正确,实例方法可以调用自己类中的实例方法 。
问题10:
考点:【JavaSE】关于直接赋值法与new方式产生对象的区别?
直接赋值法:(private String name=“abc”):先看常量池中有没有这个String对象,如果没有的话就创建一个,有的话直接拿到它的一个引用;
(1)name没有被static修饰,所以每实例化一个对象都会执行private String name=“abc”,第一次执行的时候发现字符串常量池没有value数组为[‘a’,‘b’,‘c’]的String对象,所以创建一个,因此结果是false;(2)但是第二次的时候发现已经有了这样的对象了,所以只是拿到这个对象的一个引用而已,因此2的结果返回true。
(3)执行 test.name == testB.name 的时候比较的是两个 name 指向的内存是不是同一个(比较引用本身没有意义),所以test.name==testB.name的结果也是true。参考博客
访问权限:
二、编程题
1、有假币
【思路】
已知假币比真币要轻,要求速度最快,问最多需要多少次?
1、要求最快:因此要考虑分几组最为合适?
那理论上来说,肯定是分的份数越少说明越快,因为次数越多,说明花费的时间越多。那么两堆和三堆比较,分成两堆的话,每次称重之后只能排除一半的几率,但是分三堆就可以排除2/3的几率,更加高效一些。
2、根据硬币数主要有下面几种情况:
(1)如果只有一个硬币:说明一定是假币,比较次数为0;
(2)如果有三个之内的硬币数(包含三个):比较次数为1;
(3)如果是大于三个的硬币数:
如果n%3==0,硬币数能够被均分,取三份中的最大的那份,n=n/3;
不能被均分的,此时只会多出一个或者两个硬币,虽然取其中最大的一份,需要将多余的这一个或者两个硬币都加上,但是因为是要速度最快,我们尽量满足“均分”这一条件,将硬币分的均匀,所以如果多一个,此时的最大的那份的个数就是n/3+1,另外两份相等时n/3;但是如果是多两个,那么我们将这多余的两个也分到不同的份中,因此此时的相等的那两份是n/3+1,另一份是n/3。因此最多的那份都是n/3+1。
(比如:11分的话,分成的是4,4,3 而不是3,3,5。n = 11/3+1)
因此这么分下来,三份中一定有两份是相同的,每次都先比较相同的两份,如果相等,说明假币在第三份中,如果不相等,此时假币就在这两份中的轻的那份里面。
参考博客1
参考博客2
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int n = sc.nextInt();
//如果输入数字0,表示结束
if(n == 0){
break;
}
//如果只有一张,则一定是假币
if(n == 1){
System.out.println(0);
} //如果有三张以下的钱,则最多称重一次
else if (n <= 3) {
System.out.println(1);
} //当假币数量大于三时,进行三等分:
else if (n > 3) {
int count = 1;
while (n >3){
//如果能够等分:n表示等分后每份中的数量
if(n % 3 == 0){
n/=3;
}else{//不能等分:
n = n/3+1;
}
count++;
}
System.out.println(count);
}
}
}