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” 不是一个回文。
思路
- 题目是代表一个字符串提取字母和数字,判断是否为回文,即逆方向之后还是能和之前的字符串相同
- 将字符串中所有的大写字母变成小写字母
- 从头找到是字母或者数字,若不是到下一个s[i+1],找到之后也在尾巴开始找字母或者数字,若不是则到前一个找s[a-1],直到找到
- 找到两个之后,进行比较,若相同则i+1.a-1,循环2
- 直到出现i>=a退出循环,比如:
例1:字符串:abc,c,,ba
:012345678
匹配结果:
>>>
a 0 a 8
b 1 b 7
c 2 c 4
3 3
例2:字符串: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