2018年1月6号,星期六,上午9点,本来是该睡懒觉的时间,我却早早的爬起床来
打开电脑,打开IDEA,写一下昨天京东金融的算法题,昨天只是把所有的面试题记录下来,防止未来忘记了,并没有给出答案,因为昨天太累了,想休息一下。
就是如下简单的一道题目,让我手写,我没写出来,至于原因,我内心是抵触用笔写算法题目的,没心情写,脑子空白了。
我只有用键盘才可以写出来,或许会被好多面试官认为我这个人技术不行吧。
过去的已经过去,虽然现在写出来已经没有任何意义,但是还是要弥补以往的过失,不让遗憾留给未来,
昨天遗留的问题还是需要解决掉,才可以迎接崭新的明天。
package JD;
/**
* Created by 郑云飞 on 2018/1/6.
* 计算 f(8)的值,并用程序实现
* F(1)=1
F(2)=1
F(3)=2
F(4)=3
F(5)=5
F(6)=8
F(7)=13
F(8)=?
*
*/
public class Demo1 {
public static void main(String [] args){
int result=fun(8);
System.out.println("计算结果======"+result);
}
public static int fun(int n){
int result=0;
if(n==1){
result=1;
}
if(n==2){
result=1;
}
if(n>2){
result=fun(n-1)+fun(n-2);
}
return result;
}
}
结果
集合中如何删除元素
package JD;
import java.util.ArrayList;
import java.util.List;
/**
* Created by 郑云飞 on 2018/1/6.
* 京东金融面试题之:集合中如何删除元素
*/
public class Demo2 {
/**
* 下面我们以list集合为例
*/
public static void main(String []args){
List list=new ArrayList();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
//执行如下删除操作,会有什么问题?
for(int i=0;i<list.size();i++){
if(2==list.get(i)){
list.remove(i);
}
}
//执行结果
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
输出结果
原集合:1 2 2 3
删除后集合:1 2 3
这是因为,删除时改变了list的长度。删除第一个2后,长度变为了3,这时list.get(2)为3,不再是2了,不能删除第2个2
利用for循环删除时索引没有回溯,导致漏删元素
那么怎么样才能正确删除集合中的元素呢?
1、第一种删除方式(利用for循环删除):
for(int i=0;i<list.size();i++){
if(2==list.get(i)){
list.remove(i--);// 索引回溯
}
}
运行结果
原集合:1 2 2 3
删除后集合:1 3
2、第二种删除方法(利用迭代器的remove()方法删除)
ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()){
int value = (Integer)listIterator.next();
if (2==value) {
//aList.remove(str); // 集合自身的remove()方法删除
listIterator.remove(); //迭代器的remove() 方法删除
}
}
运行结果
原集合:1 2 2 3
删除后集合:1 3
注意事项
1、利用for循环删除时索引没有回溯,导致漏删元素
2、使用迭代器循环删除元素时,没有利用迭代器remove方法删除元素而是利用集合自身的remove方法删除元素,
这样会导致“并发修改异常错误”
ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()){
int value = (Integer)listIterator.next();
if (2==value) {
list.remove(value); // 集合自身的remove()方法删除
// listIterator.remove(); //迭代器的remove() 方法删除
}
}
运行结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at JD.Demo2.main(Demo2.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Process finished with exit code 1
并发修改异常错误的产生是因为在生成迭代器后迭代器就已经确定了集合的长度size了,
而后集合删除元素后集合的size变小,
但是迭代器任然记录的是之前的size数据在迭代过程中产生并发修改异常ConcurrentModificationException,
但是如果是使用迭代器的remove()方法来删除元素的话则不会产出这个问题,因为迭代器中的cursor能够自动适应元素删除后集合大小的变化;
所以在删除集合元素时,如果适应迭代器来循环集合元素一定要使用迭代器自身的remove()方法来删除元素;