python算法学习(10)——查找排序练习题

练习题1

题目
给出两个字符串s和t,判断t是否为s的重新排列后组成的单词:
①s=“anagram”,n=“nagaram” , return True
②s=“rat”,n=“car” , return None

思路(用排序思想):
①首先判断两字符串长度是否相等,若不相等直接返回False,若相等则继续向下执行;
②将两个字符串放进列表里,分别进行排序(按字母从小到大)
③排序后,若两列表相等,则返回True,否则返回False
代码如下:

##练习题1(用排序思路)
#第一种————时间复杂度为O(nlogn)
def exercises1_1(s,t):
    '''
    :param s: str
    :param t: str
    :return: bool
    '''
    ss=list(s)
    tt=list(t)
    ss.sort()
    tt.sort()
    return ss==tt

#第二种————时间复杂度为O(nlogn)
def exercises1_2(s,t):
    '''
    :param s: str
    :param t: str
    :return: bool
    '''
    return sorted(list(s))==sorted(list(t))

#第三种(用字典类似计数排序)————时间复杂度为O(n)
def exercises1_3(s,t):
    '''
    :param s: str
    :param t: str
    :return: bool
    '''
    dict1={}  #{'a':1,'b':2}
    dict2={}
    for ch in s:
        dict1[ch]=dict1.get(ch,0)+1
    for ch in t:
        dict2[ch]=dict2.get(ch,0)+1
    return dict2==dict1

练习题2

题目
给定一个m*n的二维列表,查找一个数是否存在,返回True或False。列表有以下特性:
①每行列表从左到右已排好序;
②每一行第一个数比上一行最后一个数大。
如图中二维列表:
在这里插入图片描述
思路
①每行一个一个查找(类似顺序查找)
②二分查找
代码如下:

##练习题2(用排序思路)
#第一种————时间复杂度为O(nm)
def exercises2_1(tlist,val):
    '''
    :param tlist: list[list[int]]
    :param val: int
    :return: bool
    '''
    for line in tlist:
        if val in line:
            return True
    return  False

#第二种————时间复杂度为O(logn)
def exercises2_2(tlist,val):
    '''
    :param tlist: list[list[int]]
    :param val: int
    :return: bool
    '''
    h=len(tlist)
    if h ==0:
        return False
    w=len(tlist[0])
    if w==0:
        return False
    left=0
    right=w*h-1
    while left<=right:
        mid=(left+right)//2
        i=mid // w
        j=mid % w
        if tlist[i][j]==val:
            return  True
        elif tlist[i][j]>val:
            right=mid-1
        else:
            left=mid+1
    else:
        return False

练习题3

题目
给定一个列表和一个整数,设计算法找到两个数的下标,使两个数之和为给定整数,且保证肯定只有一个结果
例如:列表[1,3,5,7,6]和目标整数4,1+3=4,则结果返回[0,1]
思路
①双指针(两层for循环)
②二分查找
代码如下:

##练习题3(用排序思路)
#第一种————时间复杂度为O(n²)
class Solution:
    def exercises3_1(self, list, val):
        '''
        :param list: list[int]
        :param val: int
        :return: list[int]
        '''
        n=len(list)
        for i in range(n):
            for j in range(i+1,n):
                if list[i]+list[j]==val:
                    return sorted([i,j])

#第二种————时间复杂度为O()

    def binary_search(self, li, left, right, val):
        while left <= right:
            mid = (left + right) // 2
            if li[mid][0] == val:
                return mid
            elif li[mid][0] > val:
                right = mid - 1
            else:
                left = mid + 1
        return None

    def exercises3_2(self, list, val):
        '''
        :param list: list[int]
        :param val: int
        :return: list[int]
        '''
        new_lists = [[num, i] for i, num in enumerate(list)]
        new_lists.sort(key=lambda x: x[0])
        for i in range(len(list)):
            a = new_lists[i][0]
            b = val - a
            if b >= a:
                j = self.binary_search(new_lists, i + 1, len(new_lists) - 1, b)
            else:
                j = self.binary_search(new_lists, 0, i - 1, b)
            if j:
                break
        return sorted([new_lists[i][1], new_lists[j][1]])
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快快飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值