剑指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
        

猜你喜欢

转载自blog.csdn.net/weixin_41813772/article/details/82490856