python数据结构算法面试_python+算法+数据结构+面试题

一、单链表反转

#!/usr/bin/python

#递归实现单链表反转

class ListNode(object):

def __init__(self,x):

self.val=x

self.next=None

def recurse(head,newhead): #递归,head为原链表的头结点,newhead为反转后链表的头结点

if head is None:

return

if head.next is None:

newhead=head

else :

newhead=recurse(head.next,newhead)

head.next.next=head

head.next=None

return newhead

if __name__ == '__main__':

head=ListNode(1) #测试代码

p1=ListNode(2) # 建立链表1->2->3->4->None

p2=ListNode(3)

p3=ListNode(4)

head.next=p1

p1.next=p2

p2.next=p3

newhead=None

p=recurse(head,newhead) #输出链表4->3->2->1->None

while p:

print(p.val)

p=p.next

二、字符串倒序

#写一个函数, 输入一个字符串, 返回倒序排列的结果

#1).利用字符串本身的翻转

str = 'abcdef'

# def string_reverse(string):

# return string[::-1]

#

# if __name__ =="__main__":

# print(str)

# print(string_reverse(str))

#2).把字符串变成列表,用列表的reverse函数

# def string_reverse2(string):

# new_str = list(string)

# new_str.reverse()

# return ''.join(new_str)

# if __name__ =="__main__":

# print(str)

# print(string_reverse2(str))

#3).新建一个列表,从后往前取

# def string_reverse3(string):

# new_str = []

# for i in range(1,len(string)+1):

# new_str.append(string[-i])

#

# return ''.join(new_str)

#

# if __name__ =="__main__":

# print(str)

# print(string_reverse3(str))

#4).利用双向列表deque中的extendleft函数

# from collections import deque

#

# def string_reverse4(string):

# d = deque()

# d.extendleft(string)

# return ''.join(d)

#

# if __name__ =="__main__":

# print(str)

# print(string_reverse4(str))

#5).递归

# def string_reverse5(string):

# if len(string)<=1:

# return string

# else:

# return string_reverse5(string[1:])+string[0]

#

# if __name__ =="__main__":

# print(str)

# print(string_reverse5(str))

三、list去重

# 1.按升序合并如下两个list, 并去除重复的元素

list1 = [2, 3, 8, 4, 9, 5, 6]

list2 = [5, 6, 10, 17, 11, 2]

list3 = list1 + list2

sort_list = sorted(list(set(list3)))

print(sort_list)

四、排序

1.冒泡排序

时间复杂度:O(n2)

#coding:utf-8

#!/usr/bin/python

def bubble_sort(list):

for i in range(len(list)-1):

for j in range(len(list)-i-1):

if list[j]>list[j+1]:

list[j],list[j+1] = list[j+1],list[j]

return list

if __name__ == '__main__':

list = [2,3,5,19,3,5,6,7]

print(bubble_sort(list))

2.快速排序

时间复杂度:O(nlogn)

版本一:

#!/usr/bin/python3

#-*- coding:utf-8 -*-

def sub_sort(lists,low,high):

key = lists[low]

while low < high:

while low < high and lists[high] >= key:

high -= 1

lists[low] = lists[high]

print("===========")

print("low=")

print(low)

print("high=")

print(high)

print(lists)

while low < high and lists[high] < key:

low += 1

lists[high] = lists[low]

print("===========")

print("low=")

print(low)

print("high=")

print(high)

print(lists)

lists[low] = key

return low

def quick_sort(array, low, high):

if low < high:

key_index = sub_sort(array,low,high)

#递归进行排序

quick_sort(array, low, key_index)

quick_sort(array, key_index+1, high)

if __name__ == "__main__":

lists = [3, 5, 4, 2, 1, 6]

print(lists)

quick_sort(lists, 0, 5)

版本二(自己写):

# coding:utf-8

# /usr/bin/python

import time

import sys

def calc_time(func):

def wrapper(*args, **kwargs):

start_time = time.time()

result = func(*args, **kwargs)

end_time = time.time()

print(start_time)

print(end_time)

print("%s waster time is %s"%(func.__name__, end_time - start_time))

return result

return wrapper

def quick_sort(data, left, right):

if left < right:

mid = partition(data, left, right)

quick_sort(data, left, mid - 1)

quick_sort(data, mid + 1, right)

def partition(data, left, right):

tmp = data[left]

while left < right:

while left < right and data[right] >= tmp:

right -= 1

data[left] = data[right]

while left < right and data[left] <= tmp:

left += 1

data[right] = data[left]

data[left] = tmp

return left

@calc_time

def quick_sort_x(data):

return quick_sort(data, 0, len(data) - 1)

if __name__ == '__main__':

sys.setrecursionlimit(10000)

lists = list(range(1000))

#print(lists)

quick_sort_x(lists)

#print(lists)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值