Java经典笔试题—day07

🔎选择题

(1)Java属于( )

A.操作系统
B.办公软件
C.数据库系统
D.计算机语言

D

(2)类声明中,声明抽象类的关键字是 ( )

A.public
B.abstract
C.final
D.class

B

A. 访问权限修饰符
C. final 表示常量, final 修饰类表示该类不能被继承, final 修饰方法表示该方法不能被重写
D. 声明类的关键字

(3)在使用 interface 声明一个接口时,只可以使用()修饰符修饰该接口

A.private
B.protected
C.默认
D.public

D

修饰接口的修饰符为 public

(4)Math.round(11.5) 等于()

A.11
B.11.5
C.12
D.12.5

C

可以将 Math.round() 方法理解为 4 舍 5 入
在这里插入图片描述

(5)以下对继承的描述错误的是()

A.Java中的继承允许一个子类继承多个父类
B.父类更具有通用性,子类更具体
C.Java中的继承存在着传递性
D.当实例化子类时会递归调用父类中的构造方法

A

允许多个子类(>= 1) 继承一个父类, 不允许一个子类继承多个父类
允许一个类实现多个接口

(6)在 java 中 , 一个类()

A.可以继承多个类
B.可以实现多个接口
C.在一个程序中只能有一个子类
D.只能实现一个接口

B

A. 一个子类只能继承一个父类
C. 一个程序可以有多个子类
D.一个类可以实现多个接口

(7)关于以下程序代码的说明正确的 ( )

class HasStatic{
    private static int x = 100;
    public static void main(String args[ ]){
        HasStatic hs1 = new HasStatic();
        hs1.x++;
        HasStatic hs2 = new HasStatic();
        hs2.x++;
        hs1=new HasStatic();
        hs1.x++;
        HasStatic.x--;
        System.out.println( "x=" +x);
    }
}

A.5行不能通过编译,因为引用了私有静态变量
B.10行不能通过编译,因为x是私有静态变量
C.程序通过编译,输出结果为:x=103
D.程序通过编译,输出结果为:x=102

D

被 static 修饰的成员变量, 表示该类只有这一份, 所以每次 new HasStatic() 产生新的对象时, 并不会影响 x 变量
未被 static 修饰的成员变量, 表示该类可以有多份, 随着每次 new HasStatic() 产生新的对象其值也跟着发生变化
在这里插入图片描述

(8)以下 _____ 不是 Object 类的方法

A.clone()
B.finalize()
C.toString()
D.hasNext()

D

在这里插入图片描述

(9)下面哪一项不是 java 类访问权限控制关键字

A.public
B.this
C.private
D.protected

B

访问权限修饰符 public, protected, default, private
访问权限 public > protected > default > private

(10)Java 语言使用的字符码集是 ( )

A.ASCII
B.BCD
C.DCB
D.Unicode

D

🔎编程题

🥝Fibonacci数列

题目描述

Fibonacci 数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci 数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在 Fibonacci 数列中的数我们称为 Fibonacci数。给你一个N,你想让其变为一个 Fibonacci 数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为 Fibonacci 数。

输入描述

输入为一个正整数N(1 ≤ N ≤ 1,000,000)

输出描述

输出一个最小的步数变为Fibonacci数

在这里插入图片描述

解题思路

以输入的数字15为例

Fibonacci 数列为 0 1 1 2 3 5 8 13 21

其变成一个 Fibonacci 数的最小步数是2

因为15的左侧是13, 15的右侧是21
15 - 13 = 2, 21 - 15 = 6

于是问题就变为找到输入数字两侧的 Fibonacci 数字
然后返回 Math.min(n - pre, cur - n)

在这里插入图片描述
在这里插入图片描述

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 time = getNum(n);
            System.out.println(time);
        }
    }

    private static int getNum(int n) {
        if(n < 2) return 0;
        // pre 前一个元素, cur 当前元素, next 下一个元素
        int pre = 0, cur = 1, next = 0;
        while(cur < n) {
            next = pre + cur;
            pre = cur;
            cur = next;
        }
        return Math.min(n - pre , cur - n);
    }
}

📢题目链接
链接: link


🥝合法括号序列判断

题目描述

给定一个字符串A和其长度n,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)

在这里插入图片描述

解题思路

解法1

  • 题目要求合法的括号串只能由括号组成, 因此先对长度进行判断, 如果长度为奇数, return false;
  • 遍历字符串, 如果遇到的不是 ‘(’ 或者 ‘)’ , return false;
  • 将字符串中的字符存储到栈中, 遇到 ‘)’ 判断当前的栈顶元素是否为 ‘(’ , 如果是就弹出
  • 最后判断栈中的元素是否为空
    • 为空, 代表合法
    • 不为空, 代表不合法
public static boolean chkParenthesis(String A, int n) {
        // write code here
        //奇数直接false
        if((n & 1) == 1) return false;
        char[] chs = A.toCharArray();

        Deque<Character> stack = new ArrayDeque<>();
        for (int i = 0; i < n; i++) {
            char c = chs[i];
            //只能由括号组成
            if(c != '(' && c != ')') return false;

            if(!stack.isEmpty() && c == ')' && stack.peekLast() == '(') {
                stack.pollLast();
                continue;
            }

            stack.push(c);

        }
        return stack.isEmpty();
 }

解法2

  • 题目要求合法的括号串只能由括号组成, 因此先对长度进行判断, 如果长度为奇数, return false;
  • 遍历字符串, 如果遇到的不是 ‘(’ 或者 ‘)’ , return false;
  • 定义一个变量 int cnt
    • 当遇到 ‘(’ 时, cnt++
    • 当遇到 ‘)’ 时, cnt–
    • 如果 cnt < 0 , return false;
    • 因为面对任何一个合法的括号序列, 一定是先出现 ‘(’ 再出现 ‘)’ , 也就说明了 cnt 的个数始终 >= 0
public static boolean chkParenthesis(String A, int n) {
        if((n & 1) == 1) return false;
        int cnt = 0;
        for (char c : A.toCharArray()) {
            if(c != '(' && c != ')') return false;
            if(c == '(') cnt++;
            if(c == ')') cnt--;
            if(cnt < 0) return false;
        }
        return true;
}

📢题目链接
链接: link


🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值