python_lintcode_433岛屿的个数_415有效回文串

433岛屿的个数

题目

给一个01矩阵,求不同的岛屿的个数。

0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。

您在真实的面试中是否遇到过这个题? Yes
样例
在矩阵:

[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
中有 3 个岛.

思路

  • 一开始的思路是用皇后的算法,后面发现把它复杂化了
  • 后面思路是借鉴网上大神的:该矩阵为二维数组,将遍历所有grid[i][j],判断是否有1,若有将1附近的所有1都变成0,即1的上下左右有1的置为0,且也将该1的上下左右置为1,如此直到所有的上下左右再无1,此为一个岛。

代码

class Solution:
    """
    @param: grid: a boolean 2D matrix
    @return: an integer
    """
    def numIslands(self, grid):
        # write your code here
        if grid is None:return None
        if grid==[]:return 0
        #len(a)行数 len(a[0])列数
        n=len(grid)
        m=len(grid[0])
        sumd=0
        for i in range(n):
            for j in range(m):
                if grid[i][j]==1:
                    sumd+=1
                    #更改grid为1的四周环境
                    self.bian(grid,i,j)  
        return sumd

    def bian(self,grid,i,j):
        grid[i][j]=0
        #将上下左右置为0
        #上若为1,置为0,且它四周也将1置为0
        if i>=1 and grid[i-1][j]==1:
            self.bian(grid,i-1,j)
        #下若为1,置为0,且它四周也将1置为0
        if i<len(grid)-1 and grid[i+1][j]==1:
            self.bian(grid,i+1,j)
        #左若为1,置为0,且它四周也将1置为0
        if j>=1 and grid[i][j-1]==1:
            self.bian(grid,i,j-1)
        #右若为1,置为0,且它四周也将1置为0
        if j<len(grid[0])-1 and grid[i][j+1]==1:
            self.bian(grid,i,j+1)
        return grid


415有效回文串

题目

给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。

注意事项

你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。

在这个题目中,我们将空字符串判定为有效回文。

您在真实的面试中是否遇到过这个题? Yes
样例
“A man, a plan, a canal: Panama” 是一个回文。

“race a car” 不是一个回文。

思路

  • 题目是代表一个字符串提取字母和数字,判断是否为回文,即逆方向之后还是能和之前的字符串相同
    1. 将字符串中所有的大写字母变成小写字母
    2. 从头找到是字母或者数字,若不是到下一个s[i+1],找到之后也在尾巴开始找字母或者数字,若不是则到前一个找s[a-1],直到找到
    3. 找到两个之后,进行比较,若相同则i+1.a-1,循环2
    4. 直到出现i>=a退出循环,比如:
1:字符串:abc,c,,ba
        :012345678      
匹配结果:
>>> 
a 0 a 8
b 1 b 7
c 2 c 4
3 32:字符串:aa
           :01
匹配结果:
>>> 
a 0 a 1
1 0
#当c匹配完时,继续进行i=i+1,a=a=1寻找数字和字母,当满足i>=a时,左右都已经找遍

代码

class Solution:
    # @param {string} s A string
    # @return {boolean} Whether the string is a valid palindrome
    def isPalindrome(self, s):
        # Write your code here
        if s==None:return None
        if s=="":return True
        #将大写字母全化为小写字母
        s=s.lower() 
        #字符串从0开始,字符串的尾应该为len(s)-1
        a=len(s)-1
        i=0
        while i<a:
            #判断是否为数字或字母
            if s[i].isdigit() or s[i].isalpha():
                if s[a].isdigit() or s[a].isalpha():
                    if s[i]!=s[a]:
                        return False
                    i+=1
                    a-=1
                else:
                    a-=1
            else:
                i+=1
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值