0-1去重面试题
假定存在一个数组:List={0,0,1,1,0,1,0,0},我们现在需要将所有相邻且重复的0和1去除掉,比如去重后的List为{0,1,0,1,0},那么该如何实现呢?这个面试题是同事在面试社招员工的时候的出的一个简单的算法题,但是在实现算法的过程中发现同样使用remove方法,在java中可以输出正确的结果,但是在python中输出的结果却不正确,下面我就来分析其中的原因。
python的错误实现
str1 = [0, 0, 1, 1, 0, 1, 0, 0]
count = 0
while count<len(str1)-1:
if str1[count]==str1[count+1]:
str1.remove(str1[count])
else:
count = count+1;
print(str1)
输出的结果是[1, 0, 1, 0, 0]。
java的正确实现
List<Integer> deReplicationData(List<Integer> data){
//判断data.size(),不为零进行去重
if(data.size() != 0){
//循环判断重复
for(int i=0; i<data.size()-1; i++){
if( data.get(i)==data.get(i+1) ){
data.remove(i);
i--;
}
}
}
else {
System.out.println("无值");
}
return data;
}
比较
我们可以发现,java和python的代码中都是使用data.size()-1来控制循环次数,并且都使用了remove()方法对重复元素进行移除,同时在移除数组的时候,让循环的因子 i 保持不变。都是同样的逻辑,为什么java的输出是正确值,python的输出为错误值呢,这个问题最初也让我十分困扰,在确认两者算法逻辑没有问题的时候,我认为问题就出现在remove()方法上。
remove()方法
在java和python的官方教程中,查看两者的差异:


这样一比较,我们可以发现,java中的ArrayList.remove()方法中重载成为两种函数,一种是参数为obj,一种参数为Index。而python的List.remove()方法则未重载,参数只有obj。而在java和python中的remove(obj)方法中,都指明obj元素出现多次,则删除在动态数组中第一次出现的元素,而非是指定位置的元素。
这样我们回到上面的代码,很容易明白问题的所在。
解决
python中要想移除List指定位置的元素,不能使用remove(),而应该使用del()。
str1 = [0,0,1,1,0,1,0,0]
count = 0
while count<len(str1)-1:
if str1[count]==str1[count+1]:
del(str1[count])
else:
count = count+1;
print(str1)
这样输出结果就是正确的了。
13万+

被折叠的 条评论
为什么被折叠?



