劍指offer系列(十一)二叉搜尋樹與雙向連結串列, 字串的排序
阿新 • • 發佈:2018-11-11
二叉搜尋樹與雙向連結串列
題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
解題思路:
由於輸入的一個二叉搜尋樹,其左子樹小於右子樹的值,這位後面的排序做了準備,因為只需要中序遍歷即可,將所有
的節點儲存到一個列表。
對這個list[:-1]進行遍歷,每個節點的right設為下一個節點,下一個節點的left設為上一個節點。
參考程式碼:
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def Convert(self, pRootOfTree): # write code here if not pRootOfTree: return self.attr = [] self.midorder(pRootOfTree) for i,v in enumerate(self.attr[:-1]): v.right = self.attr[i+1] ########向前指標 self.attr[i+1].left = v ######## return self.attr[0] def midorder(self, root): if not root: return self.midorder(root.left) self.attr.append(root) self.midorder(root.right)
字串的排序
題目描述
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
解題思路:
依次取一個元素,然後依次和之前遞迴形成的所有子串組合,形成新的字串。
程式碼:
# -*- coding:utf-8 -*- class Solution: def Permutation(self, ss): # write code here if not len(ss): return [] if len(ss) == 1: return list(ss) charList = list(ss) charList.sort() pStr = [] for i in range(len(charList)): if i>0 and charList[i] == charList[i-1]: continue temp = self.Permutation(''.join(charList[:i])+''.join(charList[i+1:])) for j in temp : pStr.append(charList[i]+j) return pStr
陣列中出現次數超過一半的數字
題目描述
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
解題思路:
1,快排,如果該數出現次數超過陣列長度的一半,那麼,排序之後,他應該位於陣列的中間
2,根據陣列的特點,出現次數超過一半的數,他出現的次數比其他數字出現的總和還要多,
因此可以最開始儲存兩個數值:陣列中的一個數字以及它出現的次數,然後遍歷,如果下一個數字等於這個數字,那麼次數加一,如果不等,次數減一,當次數
等於0的時候,在下一個數字的時候重新複製新的數字以及出現的次數置為1,直到進行到最後,然後再驗證最後留下的數字是否
出現次數超過一半,因為可能前面的次數依次抵消掉,最後一個數字就直接是保留下來的數字,但是出現次數不一定超過一半。
程式碼:
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
count = 1
number = numbers[0]
for i in numbers[1:]:
if number == i:
count += 1
else:
count -= 1
if count == 0:
number = i #換另一個數字
count += 1
sum = 0
for j in numbers:
if j == number:
sum+=1
return number if sum>len(numbers)//2 else 0