Python日常学习

算法复习

2022-03-03  本文已影响0人  LeslieFind

1、冒泡排序

# 冒泡排序
# 思路:前后进行对比,如从小到大进行排列,i循环是大循环次数,比len小1即range(len(li))
# j的循环是为了前后比大小,把大的放倒数第一第二,所以次数会减少,因为大的已经放到后面了,所以为range(len(li)-i-1)

def maopao(li):
    for i in range(len(li)):
        for j in range(len(li)-i-1):
            if li[j]>li[j+1]:
                li[j],li[j+1] = li[j+1],li[j]
    return li

2、二分查找

'''二分查找
    在有序数组中查找元素
    思路:永远跟中间值进行比较,比中间值小向左区间找right=middle-1
    比中间值大向又区间找left=middle+1,直到middle=k结束
'''
def erFenDiGui(li,k,left,right):
    # 递归结束
    if left > right:
        return -1
    # 找区间中间值,向下取整
    middle = (left + right) // 2
    # 最终找到返回中间值停止循环
    if k  ==  li[middle]:
        return middle
    # 比中间值小,向左区间进行
    elif k < li[middle]:
        return erFenDiGui(li,k,left,middle - 1)
    # 比中间值大,向右区间进行
    else:
        return erFenDiGui(li,k,middle +1,right)

3、判断回文:

解法一(切片)、

# 回文
# 思路:1、切片反转跟原字符串对比
# 用到函数:i.isalpha()————是否为字母
#           i.isdigit()————是否为数字
#           i.lower()转换成小写字母
#           s_new[::-1]切片,反转字符串
def huiWen01(s):
    s=s.lower()
    s_new = ''
    # 提取数字和字母全转小写
    for i in s:
        if i.isalpha():
            s_new = s_new + (i)
        if i.isdigit():
            s_new = s_new + (str(i))
    if s_new == s_new[::-1]:
        return True
    else:
        return False

解法二(双指针)

# 回文:双指针做法
# 左右两个指针,循环用while,当left<right时
# 记一个高端写法: s = [ch.lower() for ch in s if ch.isalnum() // 一句话剔除除字母数字外的字符并转为小写
def huiWen02(s):
    if len(s)<=1:
        return True
    s = s.replace(' ','').lower()
    # s = [ch.lower() for ch in s if ch.isalnum()]
    left,right = 0,len(s)-1
    while left < right:
        if s[left] == s[right]:
            left +=1
            right -=1
        elif not s[left].isalnum():
            left +=1
        elif not s[right].isalnum():
            right -=1
    return True

4、基于排列构建数组

# 基于排列构建数组
# 给你一个 从 0 开始的排列 nums(下标也从 0 开始)。
# 请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),
# 都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans

# 知识点:高级写法一句话:return [nums[nums[_]] for _ in range(len(nums))]
def new_ans(nums):
    ans = []
    for i in range(len(nums)):
        ans.append(nums[nums[i]])
    return ans
# return [nums[nums[_]] for _ in range(len(nums))]

5、数组串联

知识点:extend()和+的区别:https://www.cnblogs.com/liusijun113/p/10263093.html

# 数组串联
# 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,
# 对于所有 0 <= i < n 的 i ,满足下述所有要求:
# ans[i] == nums[i]
# ans[i + n] == nums[i]
# 具体而言,ans 由两个 nums 数组 串联 形成。
# 返回数组 ans

# 知识点:nums.extend(nums); return nums
def shuZuChuanLian(nums):
    # return [nums[_] for _ in range(len(nums))]
    return nums+nums
上一篇 下一篇

猜你喜欢

热点阅读