Python 编程

1、二维数组中,每行从左到右递增,每列从上到下递增,给出一个数,判断它是否在数组中

'''
这个东西没啥写的哈
'''
def getNum(arr, num):
	if arr == None or num == None:
		return False

	line = len(arr)
	cloumn = len(arr[0])

	for i in range(line):
		if arr[i][-1] < num:
			continue
		else:
			for j in range(cloumn-1,-1,-1):
				if arr[i][j] == num:
					return [i, j]
				elif arr[i][j] < num:
					return False
	return False

arr = [[1,2,3],[4,5,6],[7,8,9]]

print(getNum(arr, 55))

2、把字符串中的空格替换成'20%'

def strReplace(str1):
	if not str1:
		return False
	return str1.replace(' ', '20%')

print(strReplace('hello word! good  luck!'))

3、从尾到头打印单链表

#链表节点
class node():
	"""docstring for node"""
	def __init__(self, data=None):
		self.data = data
		self.next = None
	def getNext():
		return self.next
	def setNext(next_node):
		if isinstance(node, next_node):
			self.next =  next_node
			return True
		else:
			return False

#创建链表
def structLinkList(arrList):
	if not arrList:
		return False
	pHead = node(arrList[0])
	tmp = pHead
	for i in range(1,len(arrList)):
		tmp.next = node(arrList[i])
		tmp = tmp.next
	return pHead

link = structLinkList([1,2,3,4,5,6,7])
#用 list 存储链表节点
tmpList = []
while link:
	tmpList.append(link)
	link = link.next
#利用 list pop 出栈实现倒序
while tmpList:
	print(tmpList.pop().data)

4、用前序和中序遍历结果构建二叉树,遍历结果中不包含重复值,例如给出了一个前序(1,2,3,4,5,6,7)和一个中序(3,2,4,1,6,5,7),需要我们给出二叉树结构。

class treeNode():
	"""docstring for treeNode"""
	def __init__(self, data=None):
		self.data = data
		self.left = None
		self.right = None

	def getRightNode():
		return self.right

	def getLeft():
		return self.left

'''
例如给出了一个前序(1,2,3,4,5,6,7)和一个中序(3,2,4,1,6,5,7),用递归进行重建
'''		
def constructTree(preOrder, inOrder):
	if not preOrder:
		return None
	root = treeNode(preOrder[0])
	point = inOrder.index(preOrder[0])
	#构建左子树
	root.left = constructTree(preOrder[1:point+1], inOrder[:point])
	#构建右子树
	root.right = constructTree(preOrder[point+1:], inOrder[point+1:])
	return root

def drawTree(graphIn, tree):
	if tree and tree.left:
		graphIn.add_edge(tree.data, tree.left.data)
		drawTree(graphIn, tree.left)
	if tree and tree.right:
		graphIn.add_edge(tree.data, tree.right.data)
		drawTree(graphIn, tree.right)
	return graphIn


tree = constructTree([1,2,3,4,5,6,7], [3,2,4,1,6,5,7])

import pygraphviz as pgv
A = pgv.AGraph(directed=True, strict=True)
A = drawTree(A, tree)
A.graph_attr['epsilon'] = '0.01'
A.write('fooOld.dot')
A.layout('dot')
A.draw('tree.png')

5、用两个栈实现队列,分别实现入队和出队操作

class queue():
	def __init__(self):
		self.inQ = []
		self.outQ = []

	def inQueue(self, num):
		self.inQ.append(num)

	def outQueue(self):
		if self.outQ:
			return self.outQ.pop()
		else:
			while self.inQ:
				self.outQ.append(self.inQ.pop())
			return self.outQ.pop()

6、把递增数组的前面部分数字移到队尾,求数组中的最小值,例如[3,4,5,6,1,2]

def rotateArrByBinarySearch(arr):
	#print(arr)
	if not arr:
		return 0
	arrlen = len(arr)
	if arrlen == 1:
		return arr[0]
	elif arrlen == 2:
		if arr[0] > arr[1]:
			return arr[1]
		else:
			return arr[0]
	else:
		if arr[arrlen//2] >= arr[arrlen//2 - 1] and arr[arrlen//2] >= arr[0]:
			return rotateArrByBinarySearch(arr[arrlen//2:])
		elif arr[arrlen//2] >= arr[arrlen//2 - 1] and arr[arrlen//2] <= arr[0]:
			return rotateArrByBinarySearch(arr[:arrlen//2 + 1])
		else:
			return arr[arrlen//2]

7、大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

def Fibonacci(n):
        # write code here
        if n == 0 or n == 1:
            return n
        x0 = 0
        x1 = 1
        i, result = 1,0
        while i < n:
            result = x0 + x1
            x0 = x1
            x1 = result
            i += 1
        return result
def jumpFloor(self, number):
    # write code her
    if number == 1 or number == 2:
        return number
    x1, x2 = 1, 2
    result = 0
    for i in range(number-2):
        x1, x2 = x2, x1 + x2
    return x2

 

8、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

def jumpFloor(self, number):
    # write code here
    if number == 1 or number == 2:
        return number
    x1, x2 = 1, 2
    result = 0
    for i in range(number-2):
        x1, x2 = x2, x1 + x2
    return x2

9、我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

原本自己觉得用递归就可以是吧,应该没问题吧,很简单很自然,但是在牛客网上提交怎么都不过?,好吧,非递归哈

def rectCover(self, number):
    # write code here
    if number == 0 or number == 1 or number == 2:
        return number
    x1, x2 = 1, 2
    for i in range(number-2):
        x1, x2 = x2, x1+x2
    return x2

10、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

def NumberOf1(self, n):
    
    num, index = 0, 1
    i = 0
    while i < 32:
        if n & index:
            num += 1
        index = index << 1
        i += 1
    return num

11、给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。讲真,没看出来这个是考察啥的。尼玛

 def Power(base, exponent):
    # write code here
    if exponent == 0:
        return 1
    res = base
    for i in range(abs(exponent)-1):
        res = res * base
    if exponent < 0:
        res = 1/res
    return res

12、输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

def reOrderArray(array):
    # write code here
    odd, even = [],[]
    for i in array:
        if i%2 == 0:
            even.append(i)
        else:
            odd.append(i)
    return odd + even

13、输入一个链表,输出该链表中倒数第k个结点。

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

def FindKthToTail(self, head, k):
    # write code here
    if k == 0:
        return None
    temp = []
    while head:
        temp.append(head.val)
        head = head.next
    k_val = 0
    while(k>0 and len(temp)>0):
        k_val = temp.pop()
        k = k - 1
    if k == 0:
        return k_val
    elif k > 0 and len(temp) == 0:
        return None

14、输入一个链表,反转链表后,输出新链表的表头。

def ReverseList(pHead):
    # write code here
    temp, head = [], pHead
    while pHead:
        temp.append(pHead.val)
        pHead = pHead.next
    pHead = head
    while pHead:
        pHead.val = temp.pop()
        pHead = pHead.next
     return head

15、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

 

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if pHead1 == None:
            return pHead2
        if pHead2 == None:
            return pHead1
        newHead, temp = '', ''
        if pHead1.val > pHead2.val:
            temp = pHead2
            newHead = temp
            pHead2 = pHead2.next
        else:
            temp = pHead1
            newHead = temp
            pHead1 = pHead1.next
        while pHead1 and pHead2:
            if pHead1.val > pHead2.val:
                temp.next = pHead2
                pHead2 = pHead2.next
            else:
                temp.next = pHead1
                pHead1 = pHead1.next
            temp = temp.next
        if pHead1 == None:
            temp.next = pHead2
        else:
            temp.next = pHead1
        return newHead
         

16、操作给定的二叉树,将其变换为源二叉树的镜像。

二叉树的镜像定义:源二叉树 
    	    8
    	   /  \
    	  6   10
    	 / \  / \
    	5  7 9 11
    	镜像二叉树
    	    8
    	   /  \
    	  10   6
    	 / \  / \
    	11 9 7  5
def Mirror(root):
    # write code here
    if root == None:
        return None
    temp = root.left
    root.left = Mirror(root.right)
    root.right = Mirror(temp)
    return root

17、输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

'''好吧,居然没测试通过,没看出有什么问题呀,除非矩阵不是 n*n ,而是 m*n 的'''
def printMatrix(self, matrix):
    # write code here
    temp = []
    lenth = len(matrix)
    for i in range(lenth//2):
        for j in range(i,lenth-i):
            temp.append(matrix[i][j])
        for j in range(i+1, lenth-i):
            temp.append(matrix[j][lenth-i-1])
        for j in range(lenth-i-2,i,-1):
            temp.append(matrix[lenth-i-1][j])
        for j in range(lenth-1-i,i,-1):
            temp.append(matrix[j][i])
    if lenth%2 != 0:
        temp.append(matrix[lenth//2][lenth//2])
    return temp

18、定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

class Solution:
    def __init__(self):
        self.ab = []
        self.cd = []
    def push(self, node):
        # write code here
        if len(self.cd)==0:
            self.cd.append(node)
        elif node > self.cd[-1]:
            self.cd.append(self.cd[-1])
        else:
            self.cd.append(node)
        self.ab.append(node)
    def pop(self):
        # write code here
        if len(self.ab) != 0:
            self.cd.pop()
            return self.ab.pop()
        else:
            return False
    def top(self):
        # write code here
        if len(self.ab) != 0:
            return self.ab[-1]
        else:
            return False
    def min(self):
        # write code here
        return self.cd[-1]

19、输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

'''
这段代码在牛客网上测试,case 通过率一直是87.5%,找了半天原因,后来恍然大悟,估计是当 sequence 是空的时候,牛客网认为是 False,好吧,不管它了,就这么写,只能说它的测试用例不好哈
'''
def VerifySquenceOfBST(sequence):
    # write code here
    if len(sequence) == 1 or len(sequence) == 0:
        return True
    root = sequence[-1]
    i = 0
    while root > sequence[i]:
        i = i + 1
    j = i
    while sequence[i] > root:
        i = i + 1
    if i != len(sequence) - 1:
        return False
    return VerifySquenceOfBST(sequence[:j]) and VerifySquenceOfBST(sequence[j:-1])

20、输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

#自己写的有点问题,提交测试失败
 def Clone(self, pHead):
        # write code here
        if not pHead:
            return None
        # 复制一遍原节点
        p1 = pHead
        while p1:
            p = RandomListNode(p1.label)
            p.next = p1.next
            p1.next = p
            p1 = p.next
        # 增加随机指针
        p1 = pHead
        while p1:
            p1.next.random = p1.random.next
            p1 = p1.next.next
        # 拆分链表
        p1 = pHead
        p2 =  p1.next
        pHead2 = p2
        while p1:
            p1.next = p1.next.next
            p1 = p1.next
            p2.next = p2.next.next
            p2 = p2.next
        return pHead2

#这个是提交可以成功的,不知道为什么?
def Clone(self, pHead):
        # write code here
        pNode=pHead
        while pNode!=None:
            pClone=RandomListNode(pNode.label)
            pClone.next=pNode.next
            pNode.next=pClone
            pNode=pClone.next
        self.ConnectSiblingNodes(pHead)
        return self.ReconnectNodes(pHead)       
    def ConnectSiblingNodes(self,pHead):
        pNode=pHead
        while pNode!=None:
            pClone=pNode.next
            if pNode.random!=None:
                pClone.random=pNode.random.next
            pNode=pClone.next
    def ReconnectNodes(self,pHead):
        pNode=pHead
        pCloneHead=None
        pCloneNode=None
        if pNode!=None:
            pCloneHead=pCloneNode=pNode.next
            pNode.next=pCloneNode.next
            pNode=pNode.next
        while pNode!=None:
            pCloneNode.next=pNode.next
            pCloneNode=pCloneNode.next
            pNode.next=pCloneNode.next
            pNode=pNode.next
        return pCloneHead

21、输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

#搞了半天才搞定,现在都开始怀疑自己的编程能力了?
def Permutation(self, ss):
    def helper(sk):
        if len(sk) == 1:
            return [list(sk)]
        s1 = list(set(sk))
        s1.sort()
        s2 = list(sk)
        nl = []
        for i in range(len(s1)):
            temp = list(s2)
            temp.remove(s1[i])
            t = helper(''.join(temp))
            for j in range(len(t)):
                nl.append([s1[i]] + t[j])
        return nl
    ha = helper(ss)
    res = []
    for i in ha:
        res.append(''.join(i))
    return res

22、数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        temp = list(numbers)
        temp.sort()
        lenth = len(temp)

        nu = temp[lenth//2]
        index = 0
        for i in temp:
            if i == nu:
                index += 1
        if index * 2 > lenth:
            return nu
        else:
            return 0

23、输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        lenth = len(tinput)
        if k > lenth:
            return []
        tinput.sort()
        return tinput[:k]

24、输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

#好尼玛伤心,别人两行代码搞定了,我写了这么多?
'''
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers:
            return ""
        num=map(str,numbers)
        num.sort(lambda x,y:cmp(x+y,y+x))
        return ''.join(num)
'''
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        def compare(a, b):
            if str(a) + str(b) > str(b) + str(a):
                return True
            else:
                return False

        def quickSort(num, beg, end):
            if beg >= end:
                return
            v = num[beg]
            b, e = beg, end
            #pdb.set_trace()
            while b < e:
                while b < e and compare(num[e], v) is True:
                    e -= 1
                num[b] = num[e]
                while b < e and compare(num[b], v) is False:
                    b += 1
                num[e] = num[b]
            num[b] = v
            quickSort(num, beg, b - 1)
            quickSort(num, b + 1, end)

        quickSort(numbers, 0, len(numbers)-1)
        small = ''
        for i in range(len(numbers)):
            small += str(numbers[i])
        return small

25、基数排序,假设排序最高为3位,从个位开始排序,稳定排序

from random import randint

'''little 2 big'''
def radix_sort(list, d=3):
    for i in range(d):
        temp = [[] for ii in range(10)]
        for j in list:
            aa = (j//(10**i)) % 10
            temp[aa].append(j)
        list = [tx for t in temp for tx in t]
        #print(list)
    return list


a = [randint(1, 999) for i in range(10)]
print(a)
a = radix_sort(a, 3)
print(a)

26、堆排序

from random import randint
def sift_down(lst, start, end):
    left = 2 * start + 1
    right = left + 1
    bigger = start
    if left < end and lst[left] > lst[bigger]:
        bigger = left
    if right < end and lst[right] > lst[bigger]:
        bigger = right
    if bigger != start:
        lst[start], lst[bigger] = lst[bigger], lst[start]
        sift_down(lst, bigger, end)


'''堆排序,大顶堆'''
def Heap_sort(lst):
    lenth = len(lst)
    for i in range((len(lst) - 2) // 2, -1, -1):
        sift_down(lst, i, lenth - 1)

    for end in range(len(lst) - 1, 0, -1):
        lst[0], lst[end] = lst[end], lst[0]
        sift_down(lst, 0, end - 1)
    return lst


a = [randint(1, 999) for i in range(10)]
print(a)
a = Heap_sort(a)
print(a)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值