【算法刷题】笔记(Day2)

文章目录

  • Leetcode刷题Day2-Python
    • 1.回文数
    • 2.电话号码的字母组合
    • 3.重新安排行程

Leetcode刷题Day2-Python

1.回文数

题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
【算法刷题】笔记(Day2)_第1张图片

解题思路(一):
1.回文数的先决条件x>0.
2.利用序列类型数据的性质,先转字符串再进行切片翻转str[::-1].
题解代码:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x<0:
            return False
        st = str(x)
        return st[::] == st[::-1]
        

解题思路(二):
1.该方法中我们选择将整个数字进行数学方法的翻转,通过取整和取余操作获取整数中对应的数字进行比较。
需要注意的点是,在python中///的区别:

>>>print("2/2 =",2/2,"2//2 =",2//2)
2/2 = 1.0 2//2 = 1
>>>a,b = 2/2,2//2
>>>print(type(a),type(b))
<class 'float'> <class 'int'>

题解代码(方法二):

class Solution:
    def isPalindrome(self, x: int) -> bool:
        res=0
        tem=x
        while tem>0:
            res = res*10+tem%10
            tem = tem//10
        return res == x

2.电话号码的字母组合

题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
【算法刷题】笔记(Day2)_第2张图片
解题思路:
1.根据题意数字到字母的映射,优先考虑字典存储映射关系:

digi_match_alpha = {
     "2":"abc","3":"def","4":"ghi","5":"jkl","6":"mno","7":"pqrs","8":"tuv","9":"wxyz"}

2.字母组合(排列组合),递归或者回溯,将每个数字看作一层,逐层遍历数字对应的字母。当然还有其他方法。
回溯法-题解代码:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        res = []
        if len(digits)==0 :
            return res
        digi_match_alpha = {
     "2":"abc","3":"def","4":"ghi","5":"jkl","6":"mno","7":"pqrs","8":"tuv","9":"wxyz"}
       
        def backtrack(strr,index):
            ##回溯的终止条件
            if index > len(digits)-1:
                res.append(strr)
                return
            digit = digits[index] ##当前的数字
            alphas = digi_match_alpha[digit] ##当前数字对应的字母
            for i in alphas:
                backtrack(strr+i,index+1)

        backtrack("",0)
        return res

递归-题解代码:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        res = []
        if len(digits)==0 :
            return res
        digi_match_alpha = {
     "2":"abc","3":"def","4":"ghi","5":"jkl","6":"mno","7":"pqrs","8":"tuv","9":"wxyz"}
        def findAlpha(digits,index,s):
            ##递归的终止条件
            if index== len(digits):
                res.append(s)
                return

            digit = digits[index] ##当前的数字
            alphas = digi_match_alpha[digit] ##当前数字对应的字母
            for i in alphas:
                findAlpha(digits,index+1,s+i) 
        findAlpha(digits,0,"")
        return res

3.重新安排行程

题目描述:
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。
【算法刷题】笔记(Day2)_第3张图片

解题思路:
1.利用python的内建模块collectionsdefaultdict,构建邻接表,将所有路径存进邻接表中。

d = collections.defaultdict(list)#邻接表
	for f, t in tickets:
    	d[f].append(t) #路径存进邻接表
        #或d[f] += [t]

2.对邻接表进行排序(即自然排序),最后利用深搜进行路径检索,将路径存放在一个列表中。

for f in d:
	d[f].sort()         #邻接表排序
ans = []
def dfs(f):             #深搜函数
	while d[f]:
    	dfs(d[f].pop(0))#路径检索
    ans.insert(0, f)    #放在最前

题解代码:

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        d = collections.defaultdict(list)#邻接表
        for f, t in tickets:
            d[f].append(t)         #路径存进邻接表
            #或d[f] += [t]
        for f in d:
            d[f].sort()         #邻接表排序
        ans = []
        def dfs(f):             #深搜函数
            while d[f]:
                dfs(d[f].pop(0))#路径检索
            ans.insert(0, f)    #放在最前
        dfs('JFK')
        return ans

知识点整理:

for f, t in tickets:
    d[f].append(t)  # 路径存进邻接表d[f] += [t] type(t) ==
print(d)

output:

defaultdict(<class 'list'>, {
     'JFK': ['SFO', 'ATL'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']})

你可能感兴趣的:(算法刷题,dfs,leetcode,python,字符串)