Python练习题集合+剑指offer

所有的剑指offer中的算法题的python实现可以查看:

第一部分

第二部分

第三部分


最好自己画图和创建虚拟数据进行理解。

目录

 

1. 输入某年某月某日,判断这是这一年的第几天

2.打印出 5 种不同形式的九九乘法表

3.判断101 - 200 之间有多少个素数, 并输出所有的素数

5.一球从100 米高度落下,每次落地后反弹的高度是原高度的一半;求它在第10次落地时,经过多少米?第10次反弹多高?

6.猴子吃桃问题,每天吃所剩桃子总数的一半加1 个,直到第10天,只剩下 1个桃子

7.打印出特定图形

8.有一组分数序列:2/1, 3/2, 5/3, 8/5, .....求出这个数列的前20 项的和

9.求 1+2!+3!。。。+20!的累加和

10.使用递归方法求阶乘10!

11.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

12 求一个3*3 矩阵的对角线的和

13.现有一个排好序的数组,输入一个数,要求按原来的顺序插入到数组中

剑指offer中的一些题目:

1.输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

2.用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

3.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

4.旋转数组的最小数字

5.斐波那契数列

6.青蛙跳台阶

7.变态跳台阶

8.矩形覆盖

9.求二进制 1 的个数

10.数字的整数次方


1. 输入某年某月某日,判断这是这一年的第几天

#coding=gbk
'''
Created on 2018年8月27日

@author: Somebody
'''
# 1. 输入某年某月某日,判断这是这一年的第几天
#特殊情况:闰年,如果输入日期大于2月,闰年需要加1 
year = int(input('year:
'))
month = int(input('month:
'))
day = int(input('day:
'))

#判断输入的天数是否正确
# 1, 3, 5, 7, 8, 10 腊
month_count = [31, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if ((year % 400 ==0) or (year % 4 ==0 and year % 100 != 0)):
    month_count.insert(1, 29)
else: 
    month_count.insert(1, 28)
print(month_count)
if(day > month_count[month - 1]):
    print('输入的天数是错误的')
    
else:
    if (0< month <= 12):
        sum =0 
        for i in range(month -1):
            sum += month_count[i]
    else:
        print('data error')
    sum += day 
    print('该天是该年的第%d 天
' %sum)
# year:
# 2000
# month:
# 3
# day:
# 1
# [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 该天是该年的第61 天

2.打印出 5 种不同形式的九九乘法表

(输出的数字的形式类似于第 7 道题中的打印出图形的例子, 这里可以将数字看做是 7 中的字符 * )

#完整格式输出九九乘法表
for i in range(1, 10):
    for j in range(1, 10):
        result = i * j 
        print('%d*%d = %2d' %(i, j, result), end = "  ")
    print()
# 1*1 =  1  1*2 =  2  1*3 =  3  1*4 =  4  1*5 =  5  1*6 =  6  1*7 =  7  1*8 =  8  1*9 =  9  
# 2*1 =  2  2*2 =  4  2*3 =  6  2*4 =  8  2*5 = 10  2*6 = 12  2*7 = 14  2*8 = 16  2*9 = 18  
# 3*1 =  3  3*2 =  6  3*3 =  9  3*4 = 12  3*5 = 15  3*6 = 18  3*7 = 21  3*8 = 24  3*9 = 27  
# 4*1 =  4  4*2 =  8  4*3 = 12  4*4 = 16  4*5 = 20  4*6 = 24  4*7 = 28  4*8 = 32  4*9 = 36  
# 5*1 =  5  5*2 = 10  5*3 = 15  5*4 = 20  5*5 = 25  5*6 = 30  5*7 = 35  5*8 = 40  5*9 = 45  
# 6*1 =  6  6*2 = 12  6*3 = 18  6*4 = 24  6*5 = 30  6*6 = 36  6*7 = 42  6*8 = 48  6*9 = 54  
# 7*1 =  7  7*2 = 14  7*3 = 21  7*4 = 28  7*5 = 35  7*6 = 42  7*7 = 49  7*8 = 56  7*9 = 63  
# 8*1 =  8  8*2 = 16  8*3 = 24  8*4 = 32  8*5 = 40  8*6 = 48  8*7 = 56  8*8 = 64  8*9 = 72  
# 9*1 =  9  9*2 = 18  9*3 = 27  9*4 = 36  9*5 = 45  9*6 = 54  9*7 = 63  9*8 = 72  9*9 = 81 
print('左上角打印出九九乘法表')
for i in  range(1, 10):
    for j in range(i, 10):
        result = i * j 
        print('%d * %d = %2d'%(i, j, result), end= " ")
    print()
# 左上角打印出九九乘法表
# 1 * 1 =  1 1 * 2 =  2 1 * 3 =  3 1 * 4 =  4 1 * 5 =  5 1 * 6 =  6 1 * 7 =  7 1 * 8 =  8 1 * 9 =  9 
# 2 * 2 =  4 2 * 3 =  6 2 * 4 =  8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 
# 3 * 3 =  9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27 
# 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 
# 5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45 
# 6 * 6 = 36 6 * 7 = 42 6 * 8 = 48 6 * 9 = 54 
# 7 * 7 = 49 7 * 8 = 56 7 * 9 = 63 
# 8 * 8 = 64 8 * 9 = 72 
# 9 * 9 = 81 
print('打印出右上角的九九乘法表')
for i in range(1, 10):
    for k in range(1, i):
        print(end = "           ")
    for j in range(i, 10):
        result = i * j 
        print('%d * %d = %2d'%(i, j, result), end= " ")
    print()
# 打印出右上角的九九乘法表
# 1 * 1 =  1 1 * 2 =  2 1 * 3 =  3 1 * 4 =  4 1 * 5 =  5 1 * 6 =  6 1 * 7 =  7 1 * 8 =  8 1 * 9 =  9 
#            2 * 2 =  4 2 * 3 =  6 2 * 4 =  8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 
#                       3 * 3 =  9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27 
#                                  4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 
#                                             5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45 
#                                                        6 * 6 = 36 6 * 7 = 42 6 * 8 = 48 6 * 9 = 54 
#                                                                   7 * 7 = 49 7 * 8 = 56 7 * 9 = 63 
#                                                                              8 * 8 = 64 8 * 9 = 72 
#                                                                                         9 * 9 = 81 
print('打印出左下角的九九乘法表')
for i in range(1, 10):
    for j in range(1, i+1):
        result = i * j 
        print('%d * %d = %2d'%(j, i, result), end= " ")
    print()
# 打印出左下角的九九乘法表
# 1 * 1 =  1 
# 1 * 2 =  2 2 * 2 =  4 
# 1 * 3 =  3 2 * 3 =  6 3 * 3 =  9 
# 1 * 4 =  4 2 * 4 =  8 3 * 4 = 12 4 * 4 = 16 
# 1 * 5 =  5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 
# 1 * 6 =  6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36 
# 1 * 7 =  7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49 
# 1 * 8 =  8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64 
# 1 * 9 =  9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81 
print('打印出右下角的九九乘法表')
for i in range(1, 10):
    for k in range(1, 10 -i):
        print(end = "           ")
    for j in range(1, i+1):
        result = i * j 
        print('%d * %d = %2d'%(j, i, result), end= " ")
    print()
# 打印出右下角的九九乘法表
#                                                                                         1 * 1 =  1 
#                                                                              1 * 2 =  2 2 * 2 =  4 
#                                                                   1 * 3 =  3 2 * 3 =  6 3 * 3 =  9 
#                                                        1 * 4 =  4 2 * 4 =  8 3 * 4 = 12 4 * 4 = 16 
#                                             1 * 5 =  5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 
#                                  1 * 6 =  6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36 
#                       1 * 7 =  7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49 
#            1 * 8 =  8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64 
# 1 * 9 =  9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81

3.判断101 - 200 之间有多少个素数, 并输出所有的素数


from math import sqrt 
h = 0 
leap = 1 # 1 代表是素数
for m in range(101, 201):
    k = int(sqrt(m))
    for i in range(2, k+1):
        if(m % i ==0):
            leap = 0
            break
    if(leap == 1):
        print('%2d'%m, end =" ")
        h += 1
        if(h % 5 ==0):
            print()
    leap = 1  
# 101 103 107 109 113 
# 127 131 137 139 149 
# 151 157 163 167 173 
# 179 181 191 193 197 
# 199 

5.一球从100 米高度落下,每次落地后反弹的高度是原高度的一半;求它在第10次落地时,经过多少米?第10次反弹多高?

#第一次落地时,为100米;第二次落地时,弹回50米,又落下50米,共200米
Sn = 100.0
Hn = 100.0/ 2
for i in range(2, 11):
    Sn += 2* Hn 
    Hn /= 2
print('总共经过%f米'%Sn)
print('第10次反弹的高度为:%f'%Hn)
# 总共经过299.609375米
# 第10次反弹的高度为:0.097656

6.猴子吃桃问题,每天吃所剩桃子总数的一半加1 个,直到第10天,只剩下 1个桃子

#采用逆向思维
x1 = 1
for day in range(9, 0, -1):
    x2 = (x1+1) * 2
    x1 = x2 
print(x2)   # 1534

7.打印出特定图形

from sys import stdout 
for i in range(4):
    for j in range(3-i):
        stdout.write(' ') #右方的空格不考虑
    for k in range(2*i + 1):  
        stdout.write('*')
    print()
#    *
#   ***
#  *****
# *******
# 只需要考虑左方的空格和*出现的方程式规律, 如k, 第0行出现1个, 第1行出现3个,所以可以得到方程  y = 2x + 1 

#打印相反方向
from sys import stdout 
for i in range(4):
    for j in range(i):
        stdout.write(' ')
    for k in range(-2 * i+7):
        stdout.write('*')
    print()
# *******
#  *****
#   ***
#    *

8.有一组分数序列:2/1, 3/2, 5/3, 8/5, .....求出这个数列的前20 项的和

a, b = b, a+b 的区别可以参考;

#使用3种方法
a = 1.0
b = 2.0
sum = 0.0
# for i in range(1, 21):
#     sum += b/a
#     t = b
#     b = a + b 
#     a = t
# print(sum)

# for i in range(1, 21):
#     sum += b/a 
#     a, b = b, a+b 
# print(sum)

from _functools import reduce
list= []
for i in range(1, 21):
    a, b = b, a+b 
    list.append(b/a)
sum = reduce(lambda x, y: x+y, list)
print(sum)
# 32.278294788817234

9.求 1+2!+3!。。。+20!的累加和

#方法1 
sum = 0
t = 1
for n in range(1, 21):
    t *= n  # 进行累乘了
    sum += t 
print(sum)  # 2561327494111820313

#方法2
def operation(x):
    s = 1
    for i in range(1, x+1):
        s *= i 
    return s 
list = range(1, 21)
sum1 = sum(map(operation, list))
print(sum1) # 2561327494111820313

10.使用递归方法求阶乘10!

def fact(i):
    sum = 0
    if (i == 0):
        sum = 1
    else:
        sum = i * fact(i-1)
    return sum 
print(fact(10)) # 3628800

11.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

str = input('请输入若干字符:')
 
def reverse(x):
    if x == -1:
        return ''
    else:
        return str[x] + reverse(x-1)
 
print(reverse(len(str)-1))

12 求一个3*3 矩阵的对角线的和

str = input('输入数字')# 输入9 个以 , 为分隔符的数字
str = str.split(sep=',')
print('输入的数字为:%s'%str)
a = []
sum = 0
for i in range(3):
    a.append([])    #数组
    for j in range(3*i, 3*(i+1)):   #间隔 
        a[i].append(int(str[j]))
print(a)
for i in range(3):
    sum += a[i][i]
print(sum)
# 输入的数字为:['1', '1', '1', '1', '6', '1', '1', '1', '10']
# [[1, 1, 1], [1, 6, 1], [1, 1, 10]]
# 17

13.现有一个排好序的数组,输入一个数,要求按原来的顺序插入到数组中

#方法1
print()
a = [1,4,6,9,13,16,19,28,40,100]
print(len(a)) #11 
a.append(0)
n = len(a)    
number = int(input("insert a new number:
"))
end = a[n -2]
if number > end:
    a[n-1] = number
else:
    for i in range(n-1):
        if a[i] > number:
            temp1 = a[i]
            a[i] = number
            for j in range(i + 1,n): #将数字后移
                temp2 = a[j]
                a[j] = temp1
                temp1 = temp2
            break
print(a)
#insert a new number:
#12
#[1, 4, 6, 9, 12, 13, 16, 19, 28, 40, 100]

#方法2
list = [1,3,5,7,9,11,15,16,17,18,0]
a1 = int(input('请输入一个数:'))
 
list.append(a)
list.sort()
print(list)

#方法3
if a > list[len(list) -1]:
    list.append(a)
else:
    for i in range(len(list)):
        if a < list[i]:
            list.insert(i, a)
            break
print(list)

剑指offer中的一些题目:

1.输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        li = []
        
        while listNode:
            li.append(listNode.val)
            listNode = listNode.next 
        return li[::-1]

2.用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        # write code here
        self.stack1.append(node)
    def pop(self):
        # return xx
        if len(self.stack2) > 0:
            return self.stack2.pop()
        while self.stack1:
            self.stack2.append(self.stack1.pop())
        if len(self.stack2) > 0:
            return self.stack2.pop()

3.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

4.旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

5.斐波那契数列

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

n<=39

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        a, b = 0, 1
        if n==0:
            return a
        else:
            for i in range(n):
                a, b = b, a+b
            return a

6.青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。算法思想:依然是斐波那切数列问题,当跳一节台阶时还有n-1个台阶,当第一次跳两个台阶时,还有n-2个台阶要跳。同样转化为斐波那契数列问题。

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        if number <= 0:
            return 1 
        elif number <3:
            return number
        else:
            a, b = 1, 2
            for i in range(3, number+1):
                a, b = b, a+b 
            return b

有公式:可以分步骤进行

1, n=1 \ 2, n=2 \ f(n-1)+f(n-2), nge3

7.变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

              | 1       ,(n=0 ) 

f(n) =     | 1       ,(n=1 )

              | 2*f(n-1),(n>=2)

f(1)=1, f(2)=2,f(3)=4cdotscdots f(n)=2*f(n-1)=2^{n-1}

# -*- coding:utf-8 -

class Solution:
    def jumpFloorII(self, number):
        # write code here
        if number <=1:
            return 1 
        else:
            return 2*self.jumpFloorII(number-1)

8.矩形覆盖

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

算法思想:当第一步是竖着放,右边还剩n-1个区域,当第一步横着放时,左下角应必须横着放,右边还剩n-2个区域,可以看出这仍斐波那切数列问题f(n)=f(n-1)+f(n-2)

# -*- coding:utf-8 -*-
class Solution:
    def rectCover(self, number):
        # write code here
        if number < 3:
            return number 
        else:
            a, b = 1, 2
            for i in range(2, number):
                a, b = b, a+b 
            return b 

9.求二进制 1 的个数

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

# -*- coding:utf-8 -*-
class Solution:
    def NumberOf1(self, n):
        # write code here
        count = 0
        if n <0:    
            n = n&0xffffffff
        while n:
            count += 1
            n = n&(n-1)
        return count 
print(bin(-6&0xFFFFFFFF)) #30个1  0b11111111111111111111111111111010

10.数字的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。



# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        result = 1
        if base == 0:
            return 0
        if exponent == 0:
            return 1
        if exponent < 0:
            for i in range(-exponent):
                result = result * base
            return 1/result
        for i in range(exponent):
            result = result * base
        return result
原文地址:https://www.cnblogs.com/junge-mike/p/12761776.html