二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路:
由于输入的一个二叉搜索树,其左子树小于右子树的值,这位后面的排序做了准备,因为只需要中序遍历即可,将所有
的节点保存到一个列表。
对这个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
#定义一个计数器,如果数组中出现次数超过一半的数字那么从左到右遍历一次后,计数器一定大于0。
count = 1
number = numbers[0]
for i in numbers[1:]:
if number == i:
count += 1
else:
count -= 1
if count == 0: #计数超过一半肯定count之后也会>0
number = i #change number
count += 1
#验证,#捕获这个使计数器大于0的数字,验证其出现次数是否超过数组长度的一半。
sum = 0
for j in numbers:
if j == number:
sum+=1
return number if sum>len(numbers)//2 else 0