0-1去重面试题中认识java中ListArray.remove()和python中的List.remove方法

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)        

这样输出结果就是正确的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值