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:\n')) month = int(input('month:\n')) day = int(input('day:\n')) #判斷輸入的天數是否正確 # 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 天\n' %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:\n")) 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), n\ge3

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)=4\cdots\cdots 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM