错题一
- 关于AOP错误的是?
答案及解析:C
AOP:Aspected Oriented Programming 面向方面编程
AOP将程序分解为各个方面或者关注点,偏重于业务处理过程的某个步骤或阶段,强调降低模块之间的
耦合度,使代码拥有更好的移植性。
OOP:面向对象编程
OOP是对业务分析中抽取的实体进行方法和属性的封装。
也可以说AOP是面向业务中的动词领域,OOP是面向名词领域。
AOP的一个很重要的特点就是源代码无关性,也就是说如果我们的系统中引用了AOP组件,即使我们把
该组件去掉,系统代码也应该能够编译通过,要实现这一点,可以使用动态proxy模式。
错题二
- 有关线程的叙述正确的是()
答案及解析:C
A:如果变量用volatile修饰,则变量是线程共享的,无法获得该变量的互斥锁。
B:线程的创建方式与线程之间互斥无关
C:synchronized关键字可以实现互斥
D:线程的创建可以通过继承Thread类或者实现Runnable接口来实现。
错题三
- Java的屏幕坐标是以像素为单位,容器的左下角被确定为坐标的起点
答案及解析:B
容器的左上角被确定为坐标的起点
错题四
- @SuppressWarnings(“deprecation”)的功能是什么?
答案及解析:A
Java三大注解分别是@Override @Deprecated @Suppresswarnings
@Override 注解表名子类中覆盖了超类中的某个方法,如果写错了覆盖形式,编译器会报错
@Deprecated 表明不希望别人在以后使用这个类,方法,变量等等
@Suppresswarnings 达到抑制编译器产生警告的目的,但是不建议使用,因为后期编码人员看不懂
编译器提示的警告,不能更好的选择更好的类去完成任务
算法一
-
重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
思路:
1.找到链表的中间节点,将链表断开,将右半部分链表反转,将这两部分链表合并。
2.我们可以对每一步都实现一个单独的方法,这样既简单又清晰
3.所以,从宏观上看,该题考查的是对链表不用操作的实现。
class Solution {
public void reorderList(ListNode head){
if (head==null){
return;
}
//找到整个链表的中间节点
ListNode mid=findMidNode(head);
//将整个链表分成2个链表
ListNode head1=head;
ListNode head2=mid.next;
mid.next=null;
//将第二个链表进行反转
head2=revereList(head2);
//合成两个链表
mergeList(head1,head2);
}
private void mergeList(ListNode head1, ListNode head2) {
ListNode t1=null,t2=null;
while(head1!=null&&head2!=null){
//防止链表断开
t1 = head1.next;
t2 = head2.next;
head1.next = head2;
head2.next = t1;
head1 = t1;
head2 = t2;
}
}
private ListNode revereList(ListNode head) {
if (head==null){
return null;
}
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
ListNode next = cur.next;
cur.next = pre;
pre=cur;
cur=next;
}
return pre;
}
private ListNode findMidNode(ListNode head) {
if (head==null){
return null;
}
ListNode fast=head,slow=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if (fast==null){
return slow;
}
}
return slow;
}
}