【强训】Day06

努力经营当下,直至未来明朗!


普通小孩也要热爱生活!

一、选择

  1. 关于抽象类与最终类,下列说法错误的是?

A 抽象类能被继承,最终类只能被实例化。
B 抽象类和最终类都可以被声明使用
C 抽象类中可以没有抽象方法,最终类中可以没有最终方法
D 抽象类和最终类被继承时,方法可以被子类覆盖

  1. 有六个元素6,5,4,3,2,1顺序入栈,问下列哪一个不是合法的出栈序列?()

A 5 4 3 6 2 1
B 4 5 3 1 2 6
C 3 4 6 5 2 1
D 2 3 4 1 5 6

  1. 阅读下列程序,选择哪一个是正确的输出结果()
class HelloA{
public HelloA()
    {
        System.out.println("I’m A class ");
    }
    static
    {
    System.out.println("static A");
    }
}
public class HelloB extends HelloA{
    public HelloB()
    {
        System.out.println("I’m B class");
    }
    static{
        System.out.println("static B");
    }
    public static void main (String[] args){
        new HelloB();
    }
}

A static A I’m A class static B I’m B class
B I’m A class I’m B class static A static B
C static A static B I’m A class I’m B class
D I’m A class static A I’m B class static B

  1. 下列代码的输出结果是____
boolean b=true?false:true==true?false:true;
System.out.println(b);

A true
B false
C null
D 空字符串

  1. 在Java中下面Class的声明哪些是错误的?【多选】

A public abstract final class Test { abstract void method(); }
B public abstract class Test { abstract final void method(); }
C public abstract class Test { abstract void method() { } } D public class Test { final void method() { } }

  1. java语言规定构造方法只能通过new自动调用。(判断正误)

二、编程

1. 不要二

不要二
二货小易有一个W*H的网格盒子,网格的行编号为0~ H-1,网格的列编号为0~W-1。每个格子至多可以放一
块蛋糕,任意两块蛋糕的欧几里得距离不能等于2

对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根

小易想知道最多可以放多少块蛋糕在网格盒子里。


2. 把字符串转换成整数

把字符串转成整数
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0。

数据范围:字符串长度满足 0 <= n <= 100
进阶:空间复杂度 O(1) ,时间复杂度 O(n)

注意:
① 字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位


答案

1. 选择

  1. 首先要搞懂抽象类(abstract修饰)和最终类(final修饰)。

① 抽象类中可以有抽象方法,也可以没有抽象方法。
② 抽象类当然可以被继承,因为它就是用来继承的
③ 继承抽象类,若有抽象方法,则子类必须将其抽象方法实现/重写。
④ 抽象类中的非抽象方法可以被重写。

最终类和抽象类正好相反。

⑤ 加上final的类就叫最终类,加上final的方法就叫最终方法。
⑥ 最终类中可以有最终方法,也可以没有。
最终类不能有子类,最终方法不能被重写
final类不能被继承或修改,final方法可以被继承但不能被覆盖。
⑨ final类可以new实例。

故:选D

  1. 栈是先进后出
    ② 并且不是一次性进栈后才出栈,可以边进栈边出栈。

故:选C

  1. 类的初始化顺序是:
    ① 初始化父类中的静态成员变量和静态代码块。
    ② 初始化子类中的静态成员变量和静态代码块。
    ③ 初始化父类中的普通成员变量和代码块,再执行父类中的构造方法。
    ④ 初始化子类中的普通成员变量和代码块,再执行子类中的构造方法。
    [静态 -> 普通、 父类 -> 子类]
    static修饰的只初始化一次,并且最先输出。

故:选C

  1. 本题考察【优先级问题
    ① 优先级:== 高于 ?: 高于 =
    优先级参考:操作符属性
    boolean b=true?false:true==true?false:true;

故:
① 第一步执行:true==true,结果为true。
② 此时表达式为boolean b = true?false:true?false:true
③ 第二步:执行三目运算符,三目运算符按照从右至左原则,true?false:false,结果为false 。
④ 此时表达式为boolean b = true?false:false;
⑤ 所以,最终结果为false

故:选B

  1. 考察abstract
    抽象类
    ① 抽象方法不能是private,默认是public。(可以使用public、protected、default)
    ② 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
    抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
    ④ 抽象类不能实例化
    ⑤ 抽象方法没有方法体

故:选ABC

  1. ① 在类的 其他构造方法中可以用this(参数) 的方式调用其他构造方法;
    ② 在类的子类中则可以通过super(参数)调用父类中指定的构造方法
    ③ 在反射中可以使用 newInstance() 的方式调用。

故:错误×

  1. 访问修饰符作用范围由大到小排列:public > protected > default > private

  2. 无路如何,如果有finally,一定要执行finally后才可以进行方法的返回!! 然后再去接着执行方法后面的内容。


2. 编程

  1. 不要二
    1)思路:

① 关键:一个坐标位置放了蛋糕,跟其欧几里得距离为2的位置不能放蛋糕,这个就是关键点
② 也就是说:如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。【注:sqrt(x)是x开算术平方根
③ 但是注意分析:因为平方保证了结果的非负性,则只可能存在0+4=4,1+3=4,2+2=4,3+1=4,4+0=4这五种情况;再者,(x1-x2)的结果只能是整数,所以在平方之后对结果是有要求的。所以:最终只可能存在0+4=4,4+0=4两种结果。
④ 即:(x1==x2)&&(|y1-y2|==2) 或者 (|x1-x2|==2)&&(y1==y2)
⑤ 使用标记法:先全部初始化为0,不能存放蛋糕的位置修改为1.【不能存放蛋糕的位置是针对0的位置来寻找的】
⑥ 使用遍历的方法。

2)代码:

import java.util.Scanner;

// 只能是长相差2 或者 宽相差2
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int pow = in.nextInt();
        int col = in.nextInt();

        // 计算能放多少cake
        int[][] cake = new int[pow][col];
        int count = 0;
        // 进行遍历
        for (int i = 0; i < pow; i++) {
            for (int j = 0; j < col; j++) {
                if(cake[i][j] == 0) {
                    count++;
                    // 进行行、列不能存放蛋糕位置的标记
                    // 但是一定要注意:标记一定是针对可以存放蛋糕的位置来标记找不能存放位置的!
                    if(i+2 < pow) {
                        cake[i+2][j] = 1;
                    }
                    if(j+2<col) {
                        cake[i][j+2] = 1;
                    }
                }
            }
        }

        // 此时已经计算出结果
        System.out.println(count);
    }
}

  1. 把字符串转换成整数
    1)思路:

① 其实就是从左往右,上次计算的结果*10,相当于10进制进位,然后加当前位的值。
如:123:sum=0, sum=sum *10+1, sum=sum * 10+2, sum=sum *10+3
② 本题的关键其实就是边界值问题
空字符串、正负号处理以及数字串中存在非法字符。
③ 方法:将字符串转为数组。
④ 计算的时候再注意一个点:数字=字符-'0'

2)代码:

public class Solution {
    public int StrToInt(String str) {
        // 首先将字符串转为数组
        char[] ch = str.toCharArray();
        // 判空
        if(str.isEmpty()) {
            return 0;
        }
        // 正负号处理
        int symbol = 1; // 记录正负数情况,默认是正数
        if(ch[0] == '+') {
            symbol = 1;
            ch[0] = '0';  // 该位是决定正负数的,使用完之后就置零,便于后续计算值
        }
        if(ch[0] == '-') {
            symbol = -1;
            ch[0] = '0';  // 该位是决定正负数的,使用完之后就置零,便于后续计算值
        }

        // 进行遍历求整数,同时判断是否有非法字符
        int sum = 0;
        // 注意,循环还必须从0开始,因为不确定首尾到底是不是符号位
        for (int i = 0; i < ch.length; i++) {
            if(ch[i]<'0' || ch[i]>'9') {
                // 这里是不合法的情况
                sum = 0;
                break;
            }
            // 这里是合法的,那就进行整数计算
            // 是从左到右的,每次*10+当前数就行
            // 还要注意一个点:ch[i]的元素类型是char,要以整数方式需要每个字符-'0'
            sum = sum*10 + ch[i] - '0';
        }


        // 最后返回结果
        sum = sum * symbol; // 千万不要忘记符号!
        return sum;
    }
}

yy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值