Python数据结构-数组(Array)

avatar 2022年2月27日18:07:05 评论 293 次浏览

数组基本操作-使用python实现

class ArrayTest:
    def test(self):
        # create an array
        a = []

        # add an element
        # time complexity: O(1)
        a.append(1)
        a.append(2)
        a.append(3)
        print(a)

        # insert an element
        # time complexity: O(n)
        a.insert(2, 99)
        print(a)

        # access element
        # time complexity: O(1)
        temp = a[2]
        print(temp)

        # update element
        # time complexity: O(1)
        a[2] = 88
        print(a)

        # remove element
        # time complexity: O(n)
        a.remove(88)
        print(a)

        a.pop(1)
        print(a)

        a.pop()
        print(a)

        # get array size
        a = [1,2,3]
        size = len(a)
        print(size)

        # interate arrqy
        # time complexity: O(n)
        for i in a:
            print(i)
        for index,element in enumerate(a):
            print("index at ", index, "is :", element)
        for i in range(0, len(a)):
            print("i:", i, 'element:', a[i])
        
        # find an element
        # time complexity: O(n)
        index = a.index(2)
        print(index)

        # sort an array
        # time complexity: O(nlogn)
        # from small to big
        a = [3, 1, 2]
        a.sort()
        print(a)
        # from big to small
        a.sort(reverse=True)
        print(a)

if __name__ == "__main__":
    test = ArrayTest()
    test.test()
485. 最大连续 1 的个数

输入:[1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.

  • 方法1:遍历计数
# 方法1
class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        result = 0
        count = 0
        for num in nums:
            if num == 1:
                count += 1
                result = max(count, result)
            else:
                count = 0
        return result

# 方法2
class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        if nums is None or len(nums)==0:
            return 0
        count = 0
        result = 0
        for num in nums:
            if num == 1:
                count += 1
            else:
                result = max(result, count)
                count = 0
        return max(result,count)
  • 方法3:动态规划
class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        # 动态数组初始化
        dp = [0]*len(nums)
        dp[0] = nums[0]
        # 动态数组变化
        for i in range(1, len(nums)):
            if nums[i] == 1:
                # 表达式
                dp[i] = dp[i-1] + 1
            else:
                dp[i] = 0
        return max(dp)

238. 除自身以外数组的乘积

输入: [1,2,3,4]
输出: [24,12,8,6]

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        result = [1]*len(nums)
        left = 1
        right = 1
        # 先对左侧的数相乘
        for i in range(len(nums)):
            result[i] *= left
            left *= nums[i]
        # 然后对右侧的数相乘
        for j in range(len(nums)-1, -1, -1):
            result[j] *= right
            right *= nums[j]
        return result
面试题 01.07. 旋转矩阵

给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 先上下进行 行反转 然后进行 对角线元素反转
        row = len(matrix)
        col = len(matrix[0])       # 列元素
        # 行反转 matrix[0][0], matrix[2][0] = matrix[2][0], matrix[0][0]
        for i in range(row//2):
            for j in range(col):
                matrix[i][j], matrix[row-i-1][j] = matrix[row-i-1][j], matrix[i][j]
        # 对角线元素反转
        for i in range(row):
            for j in range(i):   # 注意:只需要反转单侧对角线
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
        return matrix
面试题 01.08. 零矩阵

输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row = len(matrix)
        col = len(matrix[0])

        flag_row = False
        flag_col = False

        # 判断第一行是否存在 0,并进行标记
        for i in range(row):
            if matrix[i][0] == 0:
                flag_col = True
                break
        # 判断第一列是否存在 0,并进行标记
        for j in range(col):
            if matrix[0][j] == 0:
                flag_row = True
                break
        # 遍历除了第一行和第一列的元素,使用数组的第一行、第一列对应位置来存储 0 的标记。
        for i in range(1, row):
            for j in range(1, col):
                if matrix[i][j] == 0:
                    matrix[i][0] = matrix[0][j] = 0
        # 遍历除了第一行和第一列的元素,对第一行、第一列对应位置标记为 0 的元素对应的所有行列元素置为 0       
        for i in range(1, row):
            for j in range(1, col):
                if matrix[i][0] == 0 or matrix[0][j] == 0:
                    matrix[i][j] = 0
        # 最后检查第一行和第一列
        if flag_col:      
            for i in range(row):
                matrix[i][0] = 0
        if flag_row:
            for j in range(col):
                matrix[0][j] = 0

73. 矩阵置零

给定一个 m* x *n 的矩阵,如果一个元素为 **0 **,则将其所在行和列的所有元素都设为 0 。请使用 [原地]算法。

  • 相比上一道题目的解题思路,比较简单,便于理解
class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row = len(matrix)
        col = len(matrix[0])
        # 1 通过遍历查找包括 0 的行和列的位置
        locRow = set()
        locCol = set()
        for i in range(row):
            for j in range(col):
                if matrix[i][j] == 0:
                    locRow.add(i)
                    locCol.add(j)
        # 2 将包括0的行和列所有元素置为0
        for i in range(row):
            for j in range(col):
                if i in locRow or j in locCol:
                    matrix[i][j] = 0

283:移动零元素

输入:[1,2,0,0,3]
输出:[1,2,3,0,0] 保持原先的元素相对位置不变,不使用额外的空间

a = [1,2,0,0,3]
index = 0
for i in a:
    if i != 0:
        a[index] = i
        index += 1
for j in range(index+1, len(a)):
    a[j] = 0
print(a)

变位词
输入:'python', 'typhon'
输出:true

方法1:逐字检查

def anagramSolution(s1, s2):
    pos1 = 0
    stillOk = True
    alist = list(s2)                       # 将s2转变为列表,方便标记
    while pos1 < len(s1) and stillOk:      # 循环遍历s1
        pos2 = 0
        found = False
        while pos2 < len(s2) and not found: # 循环遍历s2
            if s1[pos1] == alist[pos2]:
                found = True
            else:
                pos2 += 1
        if found:
            alist[pos2] = None
        else:
            stillOk = False
        pos1 += 1

    return stillOk

s1 = 'abcde'
s2 = 'abde'
print(anagramSolution(s1, s2))

时间复杂度:两层循环O(n**2)

方法2:排序法

def compareStr(s1, s2):
    list1 = list(s1)
    list2 = list(s2)
    list1.sort() 
    list2.sort()
    pos = 0
    match = True
    while pos < len(s1) and match:
        if list1[pos] == list2[pos]:
            pos += 1
        else:
            match = False

    return match

print(compareStr('abc', 'ac'))

时间复杂度:主要是排序算法O(nlogn)

方法3:计数比较

# 总共有26个小写字母
def compareStr(s1, s2):
    c1 = [0]*26
    c2 = [0]*26
    for i in range(len(s1)):
        pos = ord(s1[i]) - ord('a')   # ASCII
        c1[pos] += 1
    for j in range(len(s2)):
        pos = ord(s1[j]) - ord('a')
        c2[pos] += 1
    # 计数结果比较
    k = 0
    match = True
    while k < 26 and match:
        if c1[k] == c2[k]:
            k += 1
        else:
            match = False
    return match
print(compareStr('abc', 'acb'))

时间复杂度:2n+26

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: