我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 刷题(想练python的可

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 刷题(想练python的可

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)
        

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 刷题(想练python的可

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

下载Word文档

猜你喜欢

Python 刷题(想练python的可

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

基于Python编写一个刷题练习系统

这篇文章主要为大家详细介绍了如何基于Python语言编写一个简单的刷题练习系统,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-02-21

python练习题

#############################userername = raw_input("USERNAME:")password = raw_input("PASSWORD:")if username == "user" a
2023-01-31

Python练习:哥德巴赫猜想

哥德巴赫 1742 年给欧拉的信中哥德巴赫提出了以下猜想:任一大于 2 的偶数都可写成两个质数之和。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。因现今数学界已经不使用“1 也是质数
2023-01-30

基于Python怎么编写一个刷题练习系统

这篇“基于Python怎么编写一个刷题练习系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么编写一个刷题
2023-07-05

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 ra
2023-01-31

python练习题1

题目:输入某年某月某日,判断这一天是这一年的第几天? 分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 情况,闰年且输入月份大于3时需考虑多加一天。 dateType= input('请输入年月日的格式为:
2023-01-31

Python--小题练习

1、Python列表排序 reverse、sort、sorted 操作方法详解reverse(倒序/反转)>>> >>> x=[1,2,3,4]>>> x.reverse()>>> print x[4, 3, 2, 1]>>> sort(正
2023-01-31

Python练习题(二)

# 1.字符串最后一个单词的长度 题目描述:计算字符串最后一个单词的长度,单词以空格隔开。 输入描述: 一行字符串,非空,长度小于5000。输出描述: 整数N,最后一个单词的长度。示例1:    输入:hello world    输出:5
2023-01-31

python题目练习

1、随机生成一个大文件(5G以上),查找里面内容最长的N(N>5)行,并打印出来[root@saltstack-ui ~]# cat gen_large_file.pyimport oswith open("a.txt", "w") as 
2023-01-31

python练习题(一)

一、用python写一个列举当前目录以及所有子目录下的文件,并打印出绝对路径#!/usr/bin/env pythonimport osfor root,dirs,files in os.walk('/tmp'):    for name
2023-01-31

Python练习题(day3)

一、函数练习题:1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。4
2023-01-31

Python的几个练习题

明天的面试也不知道公司会出什么题,为了平静一下心情,做几个python解解闷,自己模拟一下。1)从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"e:/PythonAAA/A/test.txt"中保存。string
2023-01-31

【Python基础】练习题

# 练习题'''1、简述编译型语言和解释性语言的区别,并且列出你知道哪些语言为编译型那些为解释型 编译型语言:每次编写完成后都要将其编译成二进制(0和1)文件 优点:运行速度快
2023-01-31

python习题练习(chapater

#!/usr/bin/env python# coding: utf-8'for practise in chapater five'#定义一个函数,计算并返回两个数的乘机def product(a, b): return(a * b)#根
2023-01-31

Python入门练习题(适合Python

1.使用while循环输入1 2 3 4 5 6 8 9 10#!/usr/bin/env python#-*- coding:utf-8 -*-a = 0while True:    a += 1    if a == 7:       
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录