1. 程式人生 > >劍指offer系列(十一)二叉搜尋樹與雙向連結串列, 字串的排序

劍指offer系列(十一)二叉搜尋樹與雙向連結串列, 字串的排序

二叉搜尋樹與雙向連結串列

題目描述

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

解題思路:

由於輸入的一個二叉搜尋樹,其左子樹小於右子樹的值,這位後面的排序做了準備,因為只需要中序遍歷即可,將所有
的節點儲存到一個列表。

對這個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