【强训】Day07
努力经营当下,直至未来明朗!
文章目录
- 一、选择
- 二、编程
- 1. Fibonacci数列
- 2. 合法括号序列判断 ☆
- 答案
- 1. 选择
- 2. 编程
普通小孩也要热爱生活!
一、选择
- Math.round(11.5) 等于()
A 11
B 11.5
C 12
D 12.5
- 以下对继承的描述错误的是()
A Java中的继承允许一个子类继承多个父类
B 父类更具有通用性,子类更具体
C Java中的继承存在着传递性
D 当实例化子类时会递归调用父类中的构造方法
- 以下 _____ 不是 Object 类的方法。
A clone()
B finalize()
C toString()
D hasNext()
二、编程
1. Fibonacci数列
Fibonacci数列
给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N,求最少需要多少步可以变为Fibonacci数。
2. 合法括号序列判断 ☆
合法括号序列判断
给定一个字符串A和其长度n,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)。
答案
1. 选择
Math.round();
其实就类似于“四舍五入”,但是对于正数是“四舍五入”,对于负数的话就是“五舍六入”。(一切向大了看起。)
如: ① Math.round(11.5) == 12;
② Math.round(-11.5) == -11;
③ Math.round(-11.6) == -12;
故:选C
- ① 注:java中不支持类的多继承,只有单继承;类可以实现多个接口,接口对接口可以是多继承
② 在类前加一个修饰符final后,不可以再被继承!(String就是用final修饰的,不能被继承)
③ 子类构造方法中默认有super();
④ 注意super、的三种使用方式
⑤ 同一个父类可以被多个子类继承,但是一个子类只能继承一个父类。
⑥ 注意:初始化的顺序(父子静态、父实例、子实例)
⑦ 参考:继承
故:选A
- ① Object类的方法:
② Object中没有hasNext() 方式,这个方法是迭代器Iterator中的
③ Object没有copy方法,但是有clone()方法, 用于创建并返回该对象的一个副本
④ 注:getClass是一个final方法,用于返回运行时类。
⑤ finalize方法:该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
故:选D
- java 语言使用的字符码集是:Unicode
2. 编程
- Fibonacci数列
1)思路:
① Fibonacci数列:第一项第二项是1,此后
F(n)=F(n-1)+F(n-2)
。 (可以递归 or 迭代√ )
② 先找到距离N最近的两个Fibonacci数,这两个数分别取自距离N的最近的左边一个数L和右边一个数R,然后通过min(N - L, R - N)
找到最小步数。
③ 最小步数也就是与最近的Fibonacci数相差最小值(一步只能+1 or -1)。
④ 要同时找左边和右边,也就是L<=N<=R
.
⑤ 注意计算时候的循环条件!!(一旦找到大于N的就停止,此时L也可以拿到)
2) 代码:
import java.util.Scanner;
// 再写一次:尤其要注意循环条件(也就是:找L与R的过程!!)
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()) {
int n = in.nextInt();
// 使用迭代计算Fibonacci
// 注意初始值,否则可能会出现负数的情况
int f1 = 1;
int f2 = 1;
int f3 = 2;
while (n > f3) {
// 开始进行变换继续计算Fibonacci
f1 = f2;
f2 = f3;
f3 = f1+f2;
}
// 出来说明:n<=f3,此时:
// f2 < n <=f3
// 然后计算f2、f3与n的差值,取最小值就是步数
int step = Math.min(n-f2,f3-n);
System.out.println(step);
}
}
}
- 合法括号序列判断 ☆
1)思路:
① 本题考察的其实是栈!!
② 用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。
③ 简单讲:栈中放左括号,遇到有右括号出栈继续,否则就是不匹配!
④ 原理:栈是“先进后出”结构的,而括号是最近的进行匹配。
⑤ 一定不要忘记条件判断!
⑥ 最后匹配完成后栈应该是空!
2)代码:
import java.util.*;
public class Parenthesis {
public boolean chkParenthesis(String A, int n) {
// 一定不要忘记进行条件判断
if(n%2 != 0) {
// 如果括号是单数,根本没有判断的必要
return false;
}
// 栈是先进后出,括号是最近的匹配
Stack<Character> stack = new Stack<>();
// 进行遍历:入栈和匹配出栈操作
for (int i = 0; i < A.length(); i++) {
char ch = A.charAt(i);
if(ch == '(') {
// 左括号进行入栈操作
stack.push(ch);
} else if(ch == ')'){
// 如果是右括号
// 栈不为空时才可以进行出栈操作,一旦栈为空就是false
if(stack.isEmpty()) {
return false;
}
stack.pop();
} else {
// 除了()之外的字符
return false;
}
}
// 最后判断的条件:匹配完成后栈应该是空
return stack.isEmpty();
}
}