datawhale编程task-1-数组&链表

任务预览(2天)

【数组】

  1. 实现一个支持动态扩容的数组
  2. 实现一个大小固定的有序数组,支持动态增删改操作
  3. 实现两个有序数组合并为一个有序数组
  4. 学习哈希表思想,并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)(选做)(注意:在第四天会进行继续学习)
  • 练习:

Three Sum(求三数之和)

Majority Element(求众数)

Missing Positive(求缺失的第一个正数)

【链表】

  1. 实现单链表、循环链表、双向链表,支持增删操作
  2. 实现单链表反转
  3. 实现两个有序的链表合并为一个有序链表
  4. 实现求链表的中间结点
  • 练习:

Linked List Cycle I(环形链表)

Merge k Sorted Lists(合并 k 个排序链表)

 一,数组

1,实现一个大小固定的有序数组,支持动态增删改操作

class SortedArray:
    def __init__(self, capacity = 20):
        """
        构造函数
        """
        self._capacity = capacity  #数组最大容量
        self._size = 0             #数组已使用的大小
        self._data = [None]*self._capacity #初始化元素
    
    def SortedArrayAdd(self, elem):
        """
        对大小固定的有序数组进行增加元素
        elem:待添加元素
        """
        #首元素添加
        if self._size == 0:
            self._data[0] = elem
            self._size += 1
            return 
        #数组已满就退出
        if self._size == self._capacity:
            print("数组已满")
            return
        #倒序遍历数组,移动后面的元素,直到找到插入位置
        for i in range(self._size-1, -1, -1):
            if elem < self._data[i]:
                self._data[i+1] = self._data[i]
            else:
                break
        #找到位置进行插入,更新size
        self._data[i+1] = elem
        self._size += 1
        
    def Delet(self, index):
        """
        删除指定位置index的元素
        """
        #1.判断index的合法性
        if index<0 or index>self._size-1:
            print("index不合法!删除失败")
            return 
        #2.依次挪动元素
        for i in range(index+1, self._size, 1):
            self._data[i-1] = self._data[i]
        #3.更新size
        self._size -=1
       
    def print(self):
        """
        打印数组
        """
        for i in range(self._size):
            print(self._data[i],end = '\t')

测试:

array1 = SortedArray(20)
for i in range(10):
    array1.SortedArrayAdd(i+1)
array1.print()
#添加元素
print("\n添加元素:")
array1.SortedArrayAdd(1.23)
array1.print()
print()
array1.SortedArrayAdd(4)
array1.print()
#删除元素
print("\n删除元素:")
array1.Delet(6)
array1.print()

2,实现两个有序数组合并为一个有序数组

def merge(nums1, nums2):
    m = len(nums1)
    n = len(nums2)

    count = m + n - 1
    i = m - 1
    j = n - 1
    res = [None] * (count + 1)

    while i >= 0 and j >= 0:  #逆序进行判断,nums1和nums2中最大的那个肯定在res中也是最大的
        if nums1[i] >= nums2[j]:
            res[count] = nums1[i]
            count -= 1
            i -= 1
        else:
            res[count] = nums2[j]
            count -= 1
            j -= 1

    while i >= 0:   #如果最小值在nums1中,需要接着将小的值放到res中
        res[count] = nums1[i]
        count -= 1
        i -= 1

    while j >= 0:   #如果最小值在nums2中,需要接着将小的值放到res中
        res[count] = nums2[j]
        count -= 1
        j -= 1

    return res


nums1 = [2, 2, 3, 9]
nums2 = [1, 5, 6]
print(merge(nums1, nums2))

参考:https://blog.csdn.net/weixin_43633501/article/details/90110507

https://github.com/StylishSdp/ProgrammingTask/blob/master/Task1/List/%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84.py

二,链表

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值