已知一个长度为n的列表,从列表中的第一个元素开始计数,计为第m个元素时,将此元素删除掉;再从下一个元素开始重新计数,计为第m个删除……直到数组中剩下一个元素 PS:当计数为最后一个元素,此时下一个元素

已知一个长度为n的列表,从列表中的第一个元素开始计数,计为第m个元素时,将此元素删除掉;再从下一个元素开始重新计数,计为第m个删除……直到数组中剩下一个元素
PS:当计数为最后一个元素,此时下一个元素为数组目前的第一个元素

 

#!/usr/bin/python3
#coding=utf-8
import sys 
#str = input()
#print(str)
def delm(s,n,m):
    if len(s)==1:
        return(s)
    else:
        if m > n:
            del s[m-(int(m/n)*n)-1]
        else: 
            del s[m-1]
        n = len(s)
        print(s)
        return delm(s, n, m)
if __name__ == '__main__':
    s = [1,2,3,6,8,9]
    m = 32
    n = len(s)
    print(delm(s, n, m))

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用双指针法,一个指针指向当前要删除元素,另一个指针指向下一个不为item的元素。遍历整个线性表,将不为item的元素复制到当前指针所指的位置,然后将当前指针后移一位,直到遍历完整个线性表。最后将线性表的长度更新为当前指针所指的位置即可。这个算法的空间复杂度为O(1)。 ### 回答2: 要删除线性表所有值为item的数据元素,可以利用顺序结构的存储特点,从头到尾遍历线性表,将不等于item的元素移动到新的位置上,最后修改线性表的长度即可。 具体算法如下: 1. 初始化变量count为0,用于计数不等于item的元素的个数。 2. 从下标为0开始,依次遍历线性表A的元素。 - 如果当前元素不等于item,将该元素移动到下标为count的位置,并将count自增1。 - 如果当前元素等于item,则不做任何操作。 3. 修改线性表A的长度为count,即删除了全部值为item的元素。 该算法的空间复杂度为O(1),因为只使用了常数个额外的存储空间count,不随问题规模n的增加而变化。 示例: 假设线性表A为[5, 3, 7, 3, 8, 3],item为3。 按照上述算法执行操作,遍历过程元素3都被跳过,最终线性表A变为[5, 7, 8],长度变为3。 ### 回答3: 对于顺序结构存储的线性表A,空间复杂度为O(1)的算法可以使用双指针来实现删除所有值为item的数据元素。 首先,设置两个指针i和j,初始i指向线性表的第一个元素,j指向线性表的第二个元素。然后,依次遍历线性表的每个元素。 当A[i]等于item,将指针i和j同向后移动一位。如果A[j]不等于item,则将A[j]复制到A[i]的位置上,并同将指针i和j向后移动一位。重复执行这一过程,直到遍历完整个线性表。 最后,将线性表的长度修改为i,即可删除了所有值为item的数据元素。 例如,对于线性表A=[1, 2, 3, 2, 4, 2, 5, 6, 2],如果要删除值为2的元素算法的执行过程如下: 初始状态: A=[1, 2, 3, 2, 4, 2, 5, 6, 2] i=0, j=1 执行过程: A[0]不等于2,将A[i]复制到A[i]的位置上,i和j同向后移动一位,此A=[1, 2, 3, 2, 4, 2, 5, 6, 2],i=1, j=2 A[1]等于2,i和j同向后移动一位,此A=[1, 2, 3, 2, 4, 2, 5, 6, 2],i=2, j=3 A[2]不等于2,将A[j]复制到A[i]的位置上,i和j同向后移动一位,此A=[1, 3, 3, 2, 4, 2, 5, 6, 2],i=3, j=4 ...... 最终状态: A=[1, 3, 4, 5, 6] 线性表A所有值为2的元素已被成功删除长度变为5。 整个删除过程,只使用了常数个额外的变量,因此空间复杂度为O(1)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值