iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 刷题(想练python的可
  • 893
分享到

Python 刷题(想练python的可

Python刷题python 2023-01-31 02:01:04 893人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

Surrounded Regions   这道题要求将完全由‘X’包围的‘O’全部置为‘X’,也就是将由‘X’包裹的‘O’连通块全部置为‘X’的意思。在矩阵中找连通块,直接进行bfs就可以,如果有任意的一个‘O’到了边界处,那么这个‘

Surrounded Regions

 

这道题要求将完全由‘X’包围的‘O’全部置为‘X’,也就是将由‘X’包裹的‘O’连通块全部置为‘X’的意思。在矩阵中找连通块,直接进行bfs就可以,如果有任意的一个‘O’到了边界处,那么这个‘O’连通块就没有被‘X’完全包围,否则则将全部的‘O’置为‘X’。刚开始可能是坐标计算手贱了把X和Y打错了,TLE了,后来改了就过了。

好久没写这种类型的bfs,一时半会儿手生,弱死的节奏啊。

class Solution:
    # @param board, a 9x9 2D array
    # Capture all regions by modifying the input board in-place.
    # Do not return any value.
    def solve(self, board):
        
        if board==None:
            return
        
        n = len(board)
        if n==0:
            return
        m = len(board[0])
        
        vis = [None]*len(board)
        for i in range(len(board)):
            vis[i] = [0]*len(board[0])
        
        for i in range(n):
            for j in range(m):
                if board[i][j]=='O' and vis[i][j]==0:
                    self.check(board, vis, i, j)
        
    def check(self, board, vis, x, y):
        n = len(board)
        m = len(board[0])
        
        dir = [(1, 0), (-1, 0), (0, 1), (0, -1)]
        
        flag = True
        q = []
        q.append((x, y))
        vis[x][y] = 1
        while len(q)!=0:
            curx, cury = q[0]
            q.remove(q[0])
            
            for i in range(4):
                tx = curx+dir[i][0]
                ty = cury+dir[i][1]
                if tx==-1 or tx==n or ty==-1 or ty==m:
                    flag = False
                    continue
                
                if board[tx][ty]=='O' and vis[tx][ty]==0:
                    q.append((tx, ty))
                    vis[tx][ty] = 1
                    
        if flag==False:
            return
        
        q = []
        q.append((x, y))
        vis[x][y]=2
        while len(q)!=0:
            curx, cury = q[0]
            q.remove(q[0])
            
            board[curx][cury] = 'X'

            for i in range(4):
                tx = curx+dir[i][0]
                ty = cury+dir[i][1]
                
                if tx==-1 or tx==n or ty==-1 or ty==m:
                    pass
                else:
                    if board[tx][ty]=='O' and vis[tx][ty]!=2:
                        q.append((tx, ty))
                        vis[tx][ty] = 2


Distinct Subsequences

典型的动态规划,给定串S和T,问S中有多少种可能的子序列使得该子序列正好和T相同。比如说S='aacb',T='ab',那么结果就是2.

这种直观感觉可以通过依次递推上去的,或者说是具有最优子结构性质的问题都是通过动态规划的方法来求解。定义状态dp[i][j]表示T的子串T[0, i]在S子串S[0, j]出现的合法的次数,那么状态转移方程如下:

if T[i] != S[j],dp[i][j]=dp[i][j-1]

else if T[i] == S[j], dp[i][j] = dp[i][j-1] + dp[i-1][j-1]

注意初始化dp[0][j]=1,也就是说任意的空串都在S[0,j]中出现一次。

按照上面的状态转移方程写出代码就行了。

class Solution:
    # @return an integer
    def numDistinct(self, S, T):
        if S==None or T==None:
            return 0
        if len(S)==0 or len(T)==0:
            return 0
        S = '.' + S
        T = '.' + T
        dp = [[0]*len(S) for i in range(len(T))]
        for i in range(len(S)):
            dp[0][i] = 1
        for i in range(1, len(T)):
            for j in range(i, len(S)):
                dp[i][j] = dp[i][j-1]
                if T[i] == S[j]:
                    dp[i][j] += dp[i-1][j-1]
        return dp[len(T)-1][len(S)-1]

#s = Solution()
#print(s.numDistinct('rabbbit', 'rabbit'))
#print(s.numDistinct('abc', 'ac'))
#print(s.numDistinct('abaccac', 'ac'))


Copy List with Random Pointer

这道题还是挺有意思的,咋一看题不知道考点在哪里?看了挺久才理解原来是random指针和深拷贝。所谓为深拷贝是需要重新申请一块内存,使其结构与原链表完全相同。也就是说对应链表中的节点的label值要对应相同,并且random指针指向的对象也要对应到新的对象。

由于需要将原链表中的对象对应到新生成的对象,所以用一个dict来map原来的对象到新的对象。于是进行两遍遍历,第一遍生成新的链表,并且对新链表中的label值和next指针进行赋值,next指针直接指向新生成的下一个对象;第二遍遍历,实现新链表中random指针的赋值。

注意读懂题目,找到问题的trick所在。这道题我是用python写的,可以使用对象名,如果使用c++写的话,对象的标识就是对象的指针了,写法上应该差不多。奉上Python代码:

# Definition for singly-linked list with a random pointer.
# class RandomListnode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None

class Solution:
    # @param head, a RandomListNode
    # @return a RandomListNode
    def copyRandomList(self, head):
        if head == None:
            return None
            
        myMap = {}
        nHead = RandomListNode(head.label)
        myMap[head] = nHead
        p = head
        q = nHead
        while p != None:
            q.random = p.random
            if p.next != None:
                q.next = RandomListNode(p.next.label)
                myMap[p.next] = q.next
            else:
                q.next = None
            p = p.next
            q = q.next
        
        p = nHead
        while p!= None:
            if p.random != None:
                p.random = myMap[p.random]
            p = p.next
        return nHead
        

Binary Tree Maximum Path Sum

在一棵二叉树中找到任意的一条路径,使得该条路径上的所有节点的值之和最大,该路径可以起始于树中任意节点,终止于树中的任意节点。

初一看显然有点像一个序列的最大连续子段和,这道题其实也有点类似。

我们知道,任意一个合法的路径,必然是通过某个节点,我们称之为root,从左子树的某个节点开始,通过该root走到右子树的某个节点终止达到最大的路径和。那么我们只需要记录从子树某个点开始连续走到当前节点的最大的和就行了,显然如果是走到该节点之前的最大值小于0,那么前面那一段的值就抛弃(丢弃前面一段小于0的路径肯定更优,这个和最大子段和的思路是一样的)。于是我们可以得到通过该节点的最大的子段和为root.val+leftMax+rightMax,然后用该值更新全局最优解就可以了。

奉上代码吧,比较简单。

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

class Solution:
    #def __init__(self):
    #    self.ans = 0
    # @param root, a tree node
    # @return an integer
    def maxPathSum(self, root):
        self.ans = -0xFFFFFFF
        self.dfs(root)
        return self.ans
        
    def dfs(self, root):
        if root == None:
            return 0
        if root.left == None and root.right == None:
            self.ans = max(self.ans, root.val)
            return root.val
        
        leftMax = rightMax = 0
        if root.left != None:
            leftMax = max(0, self.dfs(root.left))
        if root.right != None:
            rightMax = max(0, self.dfs(root.right))
        
        self.ans = max(self.ans, leftMax+rightMax+root.val)
        return root.val+max(leftMax, rightMax)
        

--结束END--

本文标题: Python 刷题(想练python的可

本文链接: https://www.lsjlt.com/news/185497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 刷题(想练python的可
    Surrounded Regions   这道题要求将完全由‘X’包围的‘O’全部置为‘X’,也就是将由‘X’包裹的‘O’连通块全部置为‘X’的意思。在矩阵中找连通块,直接进行bfs就可以,如果有任意的一个‘O’到了边界处,那么这个‘...
    99+
    2023-01-31
    Python 刷题 python
  • 基于Python编写一个刷题练习系统
    目录实现效果实现代码选择题填空题判断题用python给自己做个练习系统刷题吧! 实现效果 实现代码 选择题 def xuanze(): global flag2 i...
    99+
    2023-02-21
    Python实现刷题练习系统 Python刷题练习系统 Python练习系统
  • python练习题
    #############################userername = raw_input("USERNAME:")password = raw_input("PASSWORD:")if username == "user" a...
    99+
    2023-01-31
    练习题 python
  • Python练习:哥德巴赫猜想
    哥德巴赫 1742 年给欧拉的信中哥德巴赫提出了以下猜想:任一大于 2 的偶数都可写成两个质数之和。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。因现今数学界已经不使用“1 也...
    99+
    2023-01-30
    哥德巴赫 Python
  • 基于Python怎么编写一个刷题练习系统
    这篇“基于Python怎么编写一个刷题练习系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么编写一个刷题...
    99+
    2023-07-05
  • python练习题1
    题目:输入某年某月某日,判断这一天是这一年的第几天? 分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 情况,闰年且输入月份大于3时需考虑多加一天。 dateType= input('请输入年月日的格式为:...
    99+
    2023-01-31
    练习题 python
  • python练习题(一)
    一、用python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径#!/usr/bin/env pythonimport osfor root,dirs,files in os.walk('/tmp'):    for name ...
    99+
    2023-01-31
    练习题 python
  • python 练习题2
    常用函数考察:  dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))   range(10)      sorted([i for i in range(10)])   { i:i*i for i in...
    99+
    2023-01-31
    练习题 python
  • Python练习题(day3)
    一、函数练习题: 1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数 3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于...
    99+
    2023-01-31
    练习题 Python
  • Python--小题练习
    1、Python列表排序 reverse、sort、sorted 操作方法详解reverse(倒序/反转)>>> >>> x=[1,2,3,4]>>> x.reverse()&...
    99+
    2023-01-31
    小题 Python
  • python练习题-pandas
    一、实训1 读取并查看某地区房屋销售数据的基本信息 1、使用read_csv函数读取“某地区房屋销售数据.csv”文件,创建DataFrame对象housesale  首先引入第三方库,numpy和pandas import numpy a...
    99+
    2023-10-18
    pandas python 开发语言
  • Python练习题(二)
    # 1.字符串最后一个单词的长度 题目描述:计算字符串最后一个单词的长度,单词以空格隔开。 输入描述: 一行字符串,非空,长度小于5000。输出描述: 整数N,最后一个单词的长度。示例1:    输入:hello world    输出:5...
    99+
    2023-01-31
    练习题 Python
  • python题目练习
    1、随机生成一个大文件(5G以上),查找里面内容最长的N(N>5)行,并打印出来 [root@saltstack-ui ~]# cat gen_large_file.py import os with open("a.txt", "w...
    99+
    2023-01-31
    题目 python
  • Python的几个练习题
    明天的面试也不知道公司会出什么题,为了平静一下心情,做几个python解解闷,自己模拟一下。1)从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"e:/PythonAAA/A/test.txt"中保存。string...
    99+
    2023-01-31
    几个 练习题 Python
  • 【练习题】python列表
    Python列表练习题 1. 基础题 已知一个数字列表,打印列表中所有的奇数 list1 = [11, 53, 40, 45, 27, 16, 28, 99]list = []for x in li...
    99+
    2023-10-23
    python 开发语言
  • 【Python基础】练习题
    # 练习题 ''' 1、简述编译型语言和解释性语言的区别,并且列出你知道哪些语言为编译型那些为解释型 编译型语言:每次编写完成后都要将其编译成二进制(0和1)文件 优点:运行速度快 ...
    99+
    2023-01-31
    练习题 基础 Python
  • 【python二级-练习题】
    python江湖 1、求长方形面积题目描述:代码如下: 2、随机密码验证题目描述:代码如下: 3、信息分配表(字典)题目描述:代码如下: 4、全模式分词(jieb...
    99+
    2023-09-29
    python 开发语言 python二级 程序人生6
  • Python入门练习题(适合Python
    1.使用while循环输入1 2 3 4 5 6 8 9 10#!/usr/bin/env python #-*- coding:utf-8 -*- a = 0 while True:     a += 1     if a == 7:  ...
    99+
    2023-01-31
    练习题 入门 适合
  • python习题练习(chapater
     #!/usr/bin/env python# coding: utf-8'for practise in chapater five'#定义一个函数,计算并返回两个数的乘机def product(a, b): return(a * b)#...
    99+
    2023-01-31
    习题 python chapater
  • python在leecode刷题-第一题
      class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] nums=[2,7,11,...
    99+
    2023-01-30
    python leecode 刷题
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作