Java经典笔试题—day07
- 🔎选择题
- 🔎编程题
- 🥝Fibonacci数列
- 🥝合法括号序列判断
- 🔎结尾
🔎选择题
(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
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油