Python从入门到放弃(4)-代码和解题思路

Posted by 高庆东 on November 6, 2019

力扣中常用的一些操作

在列表种插入元素, insert(index,nums)
查看不重复元素 set() 异或运算:相同的两个数异或后结果还是原来的数 列表种不可以使用超出索引范围的索引会报错,但是超出范围的取子序列不会错 a[i:] 如果i特别大
返回的是一个空列表

递归

递归中需要有递归公式和中止条件,根据条件中止返回,根据递归公式列函数方程计算阶乘可以使用递归计算

def A(n):
    if n==1:
        return 1
    return A(n-1)*n #递归公式n*(n-1)

还有杨辉三角等等,最主要的是确定递归公式和终止条件

递归快速排序

def fun(s):
    if len(s)<2:
        return s
    right=[]
    light=[]
    tmp=s[0]
    del s[0]
    for i in range(0,len(s)):
        if s[i]<tmp:
            light.append(s[i])
        else:
            right.append(s[i])
    return fun(light)+[tmp]+fun(right)
s=[3,1,2,4,6,8,1,2,3]    
fun(s)

寻找数据最大值和索引

def fun(x,l):
    max_=0
    max_indx=0
    for i in range(l-1):
        max_=x[i]
        max_indx=i
        if x[i]<x[i+1]:
            max_=x[i+1]
            max_indx=i+1    
    return max_,max_indx
a=[1,2,3,1,2,3,2,2,3,21,32,4,6543,432]
a,b=fun(a,len(a))
a,b

冒泡排序

def fun(a,l):
    for i in range(l):
        for j in range(l-1):
            if a[j]>a[j+1]:
                tmp=a[j]
                a[j]=a[j+1]
                a[j+1]=tmp
    return a
a=[1,2,3,2,1,3,43,6,456,2,34]
fun(a,len(a))

整数回文数

给一个整数判断这个整数是否是回文数,不能转化为字符串
我的思路是转化为一个整数列表然后对比, 还有的思维是直接对比,取到所谓位然后对应位置对比

    def isPalindrome(self, x: int) -> bool:
        if x<0:
            return False
        pill=1
        L=[]
        while pill:
            a=10**pill
            if x%a==x:
                L.append(int(x/(a/10)))
                break
            L.append(int((x%a)/(a/10)))
            pill=pill+1
        for i in range(int(len(L)/2)):
            if L[i]!=L[len(L)-1-i]:
                return False
        return True

最长回文串

给一个字符串找到最长的回文串
我的思路就是暴力枚举所有字符串,然后判断,结果超时没通过哈哈哈哈

class Solution:
    def longest
    Palindrome(self, s: str) -> str:
        
        L=['']
        for i in range(len(s)):
            for j in range(len(s)):
                jieguo,l =self.ss(s[i:(len(s)-j)])
                if jieguo:
                    if len(L)>0:
                        if len(L[-1])<l:
                            L.append(s[i:(len(s)-j)])
        return L[-1]

    def ss(self,x):
        for i in range(int(len(x)/2)):
            if  x[i]!=x[len(x)-1-i]:
                return False,0
        return True,len(x)
                   

遍历元素查看元素个数

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。 非常经典的,要涉及一个可变的nums if来改变他的值

class Solution:
    def compressString(self, S: str) -> str:
        nums=1
        X=S
        S=S+'-'
        l=''
        for i in range(1,len(S)):

            if S[i]==S[i-1]:
                nums=nums+1
            else:
                
                l=l+S[i-1]+str(nums)
                nums=1
                
        return  l if len(l)<len(S)-1 else X

各种排序

## 冒泡
def st(nums):
    for i in range(len(nums)):
        for j in range(len(nums)-1-i):  ##精髓就是这个位置 ,将最大的放到最后
            if nums[j]>nums[j+1]:
                nums[j],nums[j+1]=nums[j+1],nums[j]
    return nums
a=[3,2,1,0]
st(a)
## 快速排序
def st(nums):
    if len(nums)<2:
        return nums
    else:    ## 思想就是大小二分然后合并
        r=[]
        l=[]
        tem=nums.pop()
        for i in nums:
            if i<tem:
                l.append(i)
            else:
                r.append(i)
        return st(l)+[tem]+st(r)
st(a)

##选择排序
def st(nums):
    for i in range(len(nums)-1):
        for j in range(i+1,len(nums)): #精髓在此 某个值往后的其他值
            if nums[i]>nums[j]:    
                nums[i],nums[j]=nums[j],nums[i]
    return nums
a=[3,2,1,1,1,1,1,6,3]
st(a)
## 插入排序
def st(nums):
    for i in range(1,len(nums)):
        for j in range(i , 0,-1):
            if nums[j]<nums[j-1]:
                nums[j-1],nums[j]=nums[j],nums[j-1]
    return nums
a=[3,2,1,1,1,1,1,6,3]
st(a)
    
##  基数排序
## 要点是找到一个数的各个位的值然后分别放到对饮的位置上再按顺取出来
def st(nums):
    l=len(str(max(nums)))
    for i in range(l):
        ll=[[] for z in range(10)]
        for k in nums:
            ll[int(k/10**i)%10].append(k)
        nums=[]
        for j in ll:
            nums=nums+j
    return nums
a=[3,2,1,4,5,2,1]
st(a)

## 计数排序
## 要点的计算每个数出现的次数然后按大小排序
def st(nums):
    ma=max(nums)
    mi=min(nums)
    l=[0 for i in range(ma-mi+1)]
    
    for i in nums:
        l[i-mi]=l[i-mi]+1
    a=[]
    for j in range(len(l)):
        a=a+[mi+j]*l[j]
    return a

a=[3,2,1]
st(a)

## 归并排序
## 分治法先分再合并
def st(nums):
    if len(nums)<2:
        return nums
    else:
        l=st(nums[:len(nums)//2])
        r=st(nums[len(nums)//2:])
        return st1(l,r)

def st1(l,r):
    i=0
    j=0
    a=[]
    while i<len(l) and j<len(r):
        if l[i]<r[j]:
            a.append(l[i])
            i=i+1
        else:
            a.append(r[j])
            j=j+1
    return a+l[i:]+r[j:]

a=[4,3,2,1]
st(a)