编程题(Python)

回文数

N = abs(int(input()))
str1 = str(N)
lenth = len(str1)
flag = 1
for i in range(lenth//2):
    if str1[i] != str1[lenth-i-1]:
        flag = 0
        break
if flag == 1:
    print('Yes')
else:
    print("No")

有符号整数反转

# 输入一个有符号整数,输出该整数的反转值。
n = int(input())
n1 = str(abs(n))
out = n1[::-1]    #字符串反转
out = int(out)    #取整,去掉0,如004变为4
if n>=0:
    print(out)
else:
    if out ==0:
        print('')
    else:
        print('-'+ str(out))

输出最长公共子串

s1 = input()
s2 = input()
maxlen = 0
p = 0
res =[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)]
for i in range(len(s1)):
    for j in range(len(s2)):
        if s1[i]==s2[j]:
            res[i+1][j+1]=res[i][j]+1
            maxlen = max(maxlen,res[i+1][j+1])
            p =i+1
print(maxlen)
print(s1[p-maxlen:p])

输出最长公共子序列

def LCS(s1, s2):
    res = [[0 for i in range(len(s2) + 1)] for j in range(len(s1) + 1)]
    for i in range(1, len(s1) + 1):
        for j in range(1, len(s2) + 1):
            if s1[i - 1] == s2[j - 1]:
                res[i][j] = res[i - 1][j - 1] + 1
            else:
                res[i][j] = max(res[i - 1][j], res[i][j - 1])
    return res
def GetLCS(i,j,res, s1, s2, s):
    while i > 0 and j > 0:
        if s1[i - 1] == s2[j - 1]:
            s += s1[i - 1]
            i -= 1
            j -= 1
        else:
            if res[i - 1][j] > res[i][j - 1]:
                i -= 1
            elif res[i - 1][j] < res[i][j - 1]:
                j -= 1
            else:
                GetLCS(i - 1, j, res, s1, s2, s)
                GetLCS(i, j - 1, res, s1, s2, s)
                return
    print(s[::-1])
if __name__ == '__main__':
    s1 = input()
    s2 = input()
    s = ''
    res = LCS(s1, s2)
    print(res[-1][-1])
    GetLCS(len(s1), len(s2), res, s1, s2, s)

字符串逆序

方法一:切片逆序

a='123456'
print(a[::-1])

方法二:遍历构造列表法:循环遍历字符串, 构造列表,从后往前添加元素, 最后把列表变为字符串

a= '12345'
def nixu(a):
    n = len(a)
    ll = []
    for i in range(n-1,-1,-1):
        ll.append(a[i])
    return ll
print(''.join(nixu(a)))

方法三:使用reverse函数:将字符串转换为列表使用reverse函数

a = '12345'
a = list(a)
a.reverse()
print(''.join(a))

方法四:递归实现,每次取最后一个字符

a = '12345'
def nixu(a):
    if len(a)<=1:
        return a
    else:
        return a[-1]+nixu(a[:-1])
print(nixu(a))

方法五:使用中间值不变,调换左右两边对应的值

a = '12345'
a = list(a)
n = len(a)
for i in range(n//2):
    a[i],a[n-i-1] = a[n-i-1],a[i]
print(''.join(a))

无重复字符最长连续子串

str = input()
def longest(s):
   start = 0  #无重复连续字符串开始位置
   end = 0 #指针遍历,先移动end,直到出现重复字符,start移到该重复字符上一次出现的位置
   same = {} #非重复字符及其出现位置,若遇到重复字符,则更新其出现的下标位置
   maxl = 0
   ss = ''  #未重复字符连续字串
   for i in range(len(s)):
      if s[i] in same.keys(): #出现重复字符,将start移到该重复字符上次出现的位置+1,将出现位置的值变为当前i
         start = same[s[i]]+1
         for k, v in list(same.items()):  #若出现重复,就将start之前出现的所有字符及其下标全部删除
               #因为若不删除,比如adda,出现重复字符d时,start已经到了2,但是从2开始a又会被当作重复字符,start就变成了1
               # 在第二个d出现之后,这个位置之前的所有字符都不能算为已经出现的字符。
            if v< start:
               del same[k]
         # same[s[i]] = i
      #如果未出现重复字符 ,无论是否为重复字符,都需要将该字符的位置下标 置为当前下标i
      same[s[i]] = i
      end = end +1
      maxl = max(maxl, end - start)
      ss =s[start:end]
      # print('i=%d,start=%d,end=%d,maxl=%d'%(i,start,end,maxl),same,ss)
   print(maxl)
longest(str)

斐波拉切记忆递归

n = int(input())
F = [-1]*(n+1)  #利用列表将前面的值进行存储,默认为-1,表示未计算过
def fib(n):
    if n == 0:
        return 0
    if n==1:
        return 1
    if F[n] == -1:  # 如果未计算过,即未存储,就递归继续前两位,如果是计算过的,就直接返回值,
        F[n] = fib(n-1)+fib(n-2)
    return F[n]     # (前面三个if都不满足,即是已经计算存储过的值,直接return),最后计算完执行return
a = fib(n)
print(a)

LeetCode编程题

来源:力扣(LeetCode)

删除排序数组中的重复项

题目:给定一个排序数组,你需要在原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:
给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        j = 0  #记录无重复元素的下标
        for i in range(len(nums)-1):
        #遇到不同的元素,就把j加1,因为从0开始,即第一个数肯定是不变的,所以从当前的下一个位置开始修改为不重复的元素。
            if nums[i+1] != nums[i]:  
                j = j + 1
                nums[j] = nums[i+1]
        return j+1

盛最多水的容器

链接:https://leetcode-cn.com/problems/container-with-most-water
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

在这里插入图片描述
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49

class Solution:
    def maxArea(self, height: List[int]) -> int:
        # 超出时间限制
        # maxV = 0
        # for i in range(len(height)-1):
        #     for j in range(i+1,len(height)):
        #         V = min(height[i],height[j]) * (j-i)
        #         maxV = max(maxV,V)
        # return maxV
        i = 0
        j = len(height)-1
        #使用快速选择的思想
        maxV = 0  
        while i < j:
            if height[i] <= height[j]:  #左边的比右边高度小,则左边的指针往右移
                v = height[i] * (j-i)
                i = i+1
            else:   #右边的比左边高度小,则右边的指针往左移
                v = height[j] * (j-i)
                j = j-1
            maxV = max(v,maxV)
        return maxV

验证二叉搜索树

链接:https://leetcode-cn.com/problems/validate-binary-search-tree/

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
 节点的左子树只包含小于当前节点的数。
 节点的右子树只包含大于当前节点的数。
 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/
1 3
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        #每个二叉树的根,
        def bianli(root,lower,upper):
            if root :
                num = root.val  
                #判断每个二叉树的根,是否在(最大值,最小值)区间内。
                if num <= lower or num >= upper:   
                    return False
                if not bianli(root.left,lower,num):   #左子树,最小值是无穷小,最大值是根
                    return False
                if not bianli(root.right,num,upper):   #右子树,最小值是根,最大值是无穷大
                    return False
            return True  
        return bianli(root,lower = float("-inf"),upper = float("inf"))

二叉树的最大深度

给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],

返回它的最大深度 3 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
  # BFS
        if root is None:
            return 0
        queue = [(1, root)]
        while queue:
            depth, node = queue.pop(0)
            if node.left:
                queue.append((depth+1,node.left))
            if node.right:
                queue.append((depth+1,node.right))
        return depth

       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值