題目1:水仙花數(shù)水仙花數(shù)(Narcissistic number)也被稱為超完全數(shù)字不變數(shù)(pluperfect digital invariant, PPDI)、自戀數(shù)、自冪數(shù)、阿姆斯壯數(shù)或阿姆斯特朗數(shù)(Armstrong number),水仙花數(shù)是指一個 3 位數(shù),它的每個位上的數(shù)字的 3次冪之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
復(fù)制代碼 隱藏代碼
for i in range(100, 1000):
i1 = i // 100 i2 = i // 10 % 10 i3 = i % 10 if i1 ** 3 + i2 ** 3 + i3 ** 3 == i:
print(f"{i}是水仙花數(shù)")
題目2:四葉玫瑰數(shù)四葉玫瑰數(shù)是4位數(shù)的自冪數(shù)。自冪數(shù)是指一個 n 位數(shù),它的每個位上的數(shù)字的 n 次冪之和等于它本身。(例如:當(dāng)n為3時,有1^3 + 5^3 + 3^3 = 153,153即是n為3時的一個自冪數(shù),3位數(shù)的自冪數(shù)被稱為水仙花數(shù))。
復(fù)制代碼 隱藏代碼
for i in range(1000,10000):
i1 = i // 1000 i2 = i // 100 % 10 i3 = i // 10 % 10 i4 = i % 10 if i1 ** 4 + i2 ** 4 + i3 ** 4 + i4 ** 4 == i:
print(f'{i}是四葉玫瑰數(shù)')
題目3:逆序輸出字符串 復(fù)制代碼 隱藏代碼
str = input("請輸入字符串")print(str[::-1])str = input("請輸入字符串")list = []for x in range(len(str) -1,-1,-1):
list.append(str[x])print(''.join(list)) 題目4:猜數(shù)字小游戲需求分析: 隨機生成一個100以內(nèi)的整數(shù),共有10次機會 開始游戲,輸入猜測的數(shù)字 如果猜小了,提示猜小了 如果猜大了,提示猜大了 猜對了,提示猜對了,并且結(jié)束游戲 10次機會用完還沒猜對,提示游戲結(jié)束,沒有猜到。
復(fù)制代碼 隱藏代碼
import random as rd
number = rd.randint(0,100)for i in range(10):
choice = int(input("請輸入你要猜測的數(shù)字:"))
if choice > number:
print("你猜大了")
elif choice < number:
print("你猜小了")
else:
print("你猜對了,真棒!")
print(f'你一共用了{i + 1}次機會')
break print(f'還剩{9 - i}次機會')else:
print('游戲結(jié)束,你沒有猜到') 題目5:百雞百錢需求分析: 公雞每只5元,母雞每只3元,小雞3只一元,現(xiàn)要求用100元錢買100只雞(三種類型的雞都要買),問公雞、母雞、小雞各買幾只? 數(shù)學(xué): 設(shè)公雞買了x只,母雞買了y只,小雞買了z只 x+y+z= 100 5x+3y+z/3 = 100 算法思路 以公雞為突破點,公雞5元一只,100元最多只能買20只, 由于三種雞都要買,所以公雞數(shù)一定是小于20的。 母雞每只3元,100全拿來買母雞,最多也不能超過33只 設(shè)公雞數(shù)為x,母雞數(shù)為y,小雞z只 只要滿足5x+3y+z/3=100 和 x+y+z==100 就可以輸出此種組合的結(jié)果.
復(fù)制代碼 隱藏代碼
count = 0for x in range(1,20):
for y in range(1,33):
z = 100 - x -y
if z > 0 and 5 * x + 3 * y + z / 3 == 100:
count += 1 print("="*60)
print(f'第{count}種買法,公雞買了{x}只,母雞買了{y}只,小雞買了{z}只')
題目6:閏年問題升級版輸入年月日,輸出該日期是否是閏年,并且輸出該日期是此年份的第幾天
閏年判斷條件: 能被4整除,并且不能被100整除 能被400整除 兩個條件滿足任意一個就為閏年
算法思路 接收用戶輸入的年月日,創(chuàng)建保存12個月份天數(shù)的列表 根據(jù)年份判斷是否是閏年,如果是把二月份設(shè)為29天,否則把二月份設(shè)為28天 根據(jù)月份和日期統(tǒng)計是當(dāng)年的第幾天
復(fù)制代碼 隱藏代碼
year = int(input("請輸入年份"))
month = int(input("請輸入月份"))
day = int(input("請輸入日期"))
date_list = [31,29,31,30,31,30,31,31,30,31,30,31]
count_day = dayif year % 4 == 0 and year % 100 !=0 or year % 400 == 0:
print(f'{year}年是閏年')
date_list[1]=29else:
print(f'{year}年是平年')
date_list[1]=28for i in range(month-1):
count_day += date_list[i]print(f'{year}年{month}月{day}日是當(dāng)年的第{count_day}天') 題目7:猴子吃桃問題需求分析: 猴子第一天摘下若干個桃子,當(dāng)即吃了一半,還不過癮,又多吃了一個。 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。 以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。 求原來它一共摘了多少個桃子。 這題得倒著推。第10天還沒吃,就剩1個,說明第9天吃完一半再吃1個還剩1個。 假設(shè)第9天還沒吃之前有桃子p個 可得:p/2 - 1 = 1,得出第九天的桃子數(shù)p=4。 以此類推,即可算出第一天摘了多少桃子.
算法思路 第10天還沒吃之前的桃子數(shù)量初始化p=1 從9至1循環(huán)9次,根據(jù)上述公式反推為p=(p+1)*2可得 第1天還沒吃之前的桃子數(shù)量
復(fù)制代碼 隱藏代碼
p = 1print(f'第10天還剩下{p}個桃子')for i in range(9,0,-1):
p = (p + 1) * 2 print(f'第{i}天還剩下{p}個桃子')print(f'第一天一共摘了{p}個桃子') 題目8:冒泡排序冒泡排序算法由來 這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序” 從前到后(即從下標較小的元素開始) 依次比較相鄰元素的值,若發(fā)現(xiàn)比后一個值大則交換位置,使值較大的元素逐漸從前移向后部。
假設(shè)有一個列表 [29 ,12 ,19 ,37 ,14] 想升序 第一輪 比較 29 > 12 交換位置 [12,29,19,37,14] 比較 29 > 19 交換位置 [12,19,29,37,14] 比較 29 > 37 不大于 不交換,列表同上 比較 37 > 14 交換位置 [12,19,29,14,37]
第二輪 比較 12 > 19 不大于 不交換,列表同上 比較 19 > 29 不大于 不交換,列表同上 比較 29 > 14 交換位置 [12,19,14,29,37]
第三輪 比較 12 > 19 不大于 不交換,列表同上 比較 19 > 14 交換位置 [12,14,19,29,37]
第四輪 比較 12 > 14 不大于 不交換,列表同上 完成 [12,14,19,29,37]
復(fù)制代碼 隱藏代碼
import numpy as np
pop_list = np.random.randint(100,size=6)count = len(pop_list)print('沒排序之前的列表',pop_list)for i in range(count-1):
for j in range(count-i-1):
if pop_list[j] > pop_list[j + 1]: pop_list[j],pop_list[j+1] = pop_list[j+1],pop_list[j]print('排好序的列表為',pop_list) 題目9:二分查找法二分法是一種效率比較高的搜索方法 回憶之前做過的猜數(shù)字的小游戲,預(yù)先給定一個小于100的正整數(shù)x,讓你猜,猜測過程中給予大小判斷的提示,問你怎樣快速地猜出來? 我們之前做的游戲給定的是10次機會,如果我們學(xué)會二分查找法以后,不管數(shù)字是多少,最多只需要7次就能猜到數(shù)字
二分查找法 首先先猜50,如果猜對了,結(jié)束;如果猜大了,往小的方向猜,再猜25;如果猜小了,往大的方向猜,再猜75;...每猜測1次就去掉一半的數(shù),這樣我們就可以逐步逼近預(yù)先給定的數(shù)字.這種思想就是二分法。
二分法適用情況 必須是有序的序列。 對數(shù)據(jù)量大小有要求。 數(shù)據(jù)量太小不適合二分查找,與直接遍歷相比效率提升不明顯。 數(shù)據(jù)量太大也不適合用二分查找,因為數(shù)組需要連續(xù)的存儲空間,若數(shù)據(jù)量太大,往往找不到存儲如此大規(guī)模數(shù)據(jù)的連續(xù)內(nèi)存空間
算法思路 假設(shè)有一個有序列表 [5,7,11,22,27,33,39,52,58] 請問數(shù)字11是否在此列表中,如果在它的索引值為多少? 首先我們?nèi)∮行蛄斜淼闹虚g位置 27 和 11 進行比較 我們發(fā)現(xiàn) 11 是小于 27 的 所以我們排除 27 右邊的數(shù)字 [5,7,11,22,27(排除了右邊的),33,39,52,58] 接著我們?nèi)?[5,7,11,22] 位置中間的 7 和 11 比較 發(fā)現(xiàn) 11 是大于 7 的 所以我們排除 7 左邊的數(shù)字 最后我們?nèi)?11到22 的中間位置 剛好到了11 這時候就可以返回 11 的索引值了,如果沒有找到就提示不存在
第一種 純算法的方式
復(fù)制代碼 隱藏代碼
arr_list = [5,7,11,22,27,33,39,52,58]
number = 11count = 0left = 0right = len(arr_list)-1while left<=right:
middle = (left+right)//2 count += 1 if number > arr_list[middle]:
left = middle +1 elif number < arr_list[middle]:
right = middle - 1 else:
print(f'數(shù)字{number}已找到,索引值為{middle}')
breakelse:
print(f'數(shù)字{number}沒有找到')print(f'一共用了{count}次查找')
數(shù)字11已找到,索引值為2
一共用了3次查找 第二種 遞歸函數(shù)的方式
復(fù)制代碼 隱藏代碼
arr_list = [5,7,11,22,27,33,39,52,58]def binary_search(number,left,right): if left <= right:
middle = (left + right) // 2 if number < arr_list[middle]:
right = middle - 1 elif number > arr_list[middle]:
left = middle + 1 else:
return middle
return binary_search(number,left,right)
else:
return -1print(binary_search(11,0,len(arr_list)-1)) 題目10:選擇排序基本思想:從未排序的序列中找到一個最小的元素,放到第一位,再從剩余未排序的序列中找到最小的元素,放到第二位,依此類推,直到所有元素都排序完畢
若列表 [6,8,3,5,9,10,7,2,4,1] 先找到 1 最小 調(diào)換 [1, 8, 3, 5, 9, 10, 7, 2, 4, 6] 接著是 2 最小 調(diào)換 [1, 2, 3, 5, 9, 10, 7, 8, 4, 6] 接著是 3 最小 位置不變 接著是 4 最小 調(diào)換 [1, 2, 3, 4, 9, 10, 7, 8, 5, 6] 接著是 5 最小 調(diào)換 [1, 2, 3, 4, 5, 10, 7, 8, 9, 6] 接著是 6 最小 調(diào)換 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 接著是 7 最小 位置不變 接著是 8 最小 位置不變 接著是 9 最小 位置不變 接著是 10 最小 位置不變
復(fù)制代碼 隱藏代碼
import random as rd
sec_list = [rd.randint(1,100) for i in range(8)]length = len(sec_list)print(f'未排序的列表為:{sec_list}')for i in range(length -1):
min_index = i
for j in range(i + 1,length):
if sec_list[min_index] > sec_list[j]:
min_index = j
sec_list[min_index],sec_list[i] = sec_list[i],sec_list[min_index]
print(f'第{i+1}輪排好序是:{sec_list}')print(f'最終排好序的列表為:{sec_list}') 題目11:剪刀石頭布游戲開始,初始狀態(tài)下用戶和電腦都有100分,贏一局+10分,輸一局-10分。當(dāng)用戶為0分時,游戲結(jié)束,提示游戲結(jié)束,比賽輸了,當(dāng)用戶為200分時,游戲結(jié)束,提示游戲結(jié)束,贏得比賽、每輪比賽都輸出當(dāng)前的分數(shù) 1代表剪刀 2代表石頭 3代表布
復(fù)制代碼 隱藏代碼
import random as rdprint('=' * 60)print(' ' * 20, '剪刀石頭布游戲')print('1代表剪刀 2代表石頭 3代表布')
game_info = {1: "剪刀", 2: "石頭", 3: "布"}
score = 100while True:
robots_choice = rd.randint(1, 3)
user_choice = input("請出拳")
if user_choice not in '123':
print('出拳錯誤,請重新出拳')
continue user_choice = int(user_choice)
print('*' * 60)
print(f'電腦出{game_info[robots_choice]}')
print(f'你出{game_info[user_choice]}')
print('*' * 60)
if user_choice == 1 and robots_choice == 3 or user_choice == 2 \
and robots_choice == 1 or user_choice == 3 and robots_choice == 2:
score += 10 print(f'你贏得本輪游戲,當(dāng)前分數(shù)為{score}')
elif user_choice == robots_choice:
print(f'本輪游戲平局,當(dāng)前分數(shù)為{score}')
else:
score -= 10 print(f'你輸了本輪游戲,當(dāng)前分數(shù){score}')
if score >= 200:
print('游戲結(jié)束,你贏得比賽')
break elif score <= 0:
print('游戲結(jié)束,你輸了')
break 題目12:快樂數(shù)在給定的數(shù)字下,該數(shù)字所有數(shù)位(digits)的平方和,得到的新數(shù)再次求所有數(shù)位的平方和,如此重復(fù)進行,最終結(jié)果必定為1
比如數(shù)字:19 1 1 = 1 9 9 = 81 = 1 + 81 = 82 8 8 = 64 2 2 = 4 = 64 + 4 = 68 6 6 = 36 8 8 = 64 = 36 + 64 = 100 1 + 0 + 0 = 1
復(fù)制代碼 隱藏代碼
def sum_square(n): sum = 0 for i in str(n):
sum += int(i) ** 2 return sumlist1 = []
n = int(input('請輸入數(shù)字:'))while sum_square(n) not in list1:
n = sum_square(n)
list1.append(n)if n == 1:
print('是快樂數(shù)')else:
print('不是快樂數(shù)') 題目13:猜年齡(一)小明帶兩個妹妹參加元宵燈會。別人問她們多大了,她們調(diào)皮地說:“我們倆的年齡之積是年齡之和的6倍“。 小明又補充說:“她們可不是雙胞胎,年齡差肯定也不超過8歲啊?!?/p> 請你寫出:小明的較小的妹妹的年齡。
復(fù)制代碼 隱藏代碼
for i in range(1,100):
for j in range(1,i):
if i*j == 6*(i+j) and i-j<8:
print(i,j) 題目14:猜年齡(二)美國數(shù)學(xué)家維納(N.Wiener)智力早熟,11歲就上了大學(xué)。 他曾在1935~1936年應(yīng)邀來中國清華大學(xué)講學(xué)。 一次,他參加某個重要會議,年輕的臉孔引人注目。于是有人詢問他的年齡, 他回答說:“我年齡的立方是個4位數(shù)。我年齡的4次方是個6位數(shù)。 這10個數(shù)字正好包含了從0到9這10個數(shù)字,每個都恰好出現(xiàn)1次?!?br style='overflow-wrap: break-word;'/>請你推算一下,他當(dāng)時到底有多年輕
復(fù)制代碼 隱藏代碼
for i in range(10,30):
i3 = str(i ** 3)
i4 = str(i ** 4)
if len(i3) == 4 and len(i4) == 6:
if len(set(i3+i4)) == 10:
print(i)
print(i3 + i4) 題目15:split算法實現(xiàn)split是python字符串內(nèi)置的一個非常有用的方法它可以將一個字符串通過分隔符切成我們想要的列表比如現(xiàn)在我們有個字符串 life-is-short-you-need-python 每一個單詞之間使用橫桿進行分割,當(dāng)我們?nèi)フ{(diào)用字符串split的方法之后傳入我們的分隔符橫桿 - 那我們就會得到一個列表列表里面每個元素其實就是通過分隔符切出來的子字符串 那這個算法該怎么樣去實現(xiàn)呢?python內(nèi)置的split方法是通過C語言實現(xiàn)的,我們今天去寫一個函數(shù),去實現(xiàn)和split相同的功能 我們先來講下算法該怎么樣去實現(xiàn)這個算法需要我們對字符串進行迭代,我們先去定義一個初始化的指針,因為我們切片的時候需要從哪一個開始的位置進行切,所以我們先要初始化一個指針 我們可以定義一個指針變量,默認值為0,緊接著我們開始對字符串進行迭代,當(dāng)碰到第一個分隔符的時候,我們是不是會獲取到當(dāng)前分隔符的索引,那這個時候,我們就把初始的指針開始到分隔符結(jié)束對字符串進行切片 因為我們字符串是遵守左閉右開的,你的結(jié)束索引寫的是分隔符的索引,所以只會切到life,我們并把它添加到列表里面,緊接著添加完之后呢,我們需要把初始化的指針修改一下位置,修改到哪個地方呢?修改到我們第一次碰到的分隔符的下一個位置 也就是i,緊接著繼續(xù)進行迭代,迭代之后發(fā)現(xiàn)第二個分隔符,是不是還有一個分隔符的索引,這個時候我們繼續(xù)向字符串進行切片,切片的開始位置是你的i這個位置的指針,結(jié)束的位置是第二個 - 的指針,那遵循左閉右開,所以我們is這個單詞,也可以添加進列表 就這樣一直到最后呢,當(dāng)我們?nèi)サ阶詈笠粋€字符n的時候,發(fā)現(xiàn)后面是沒有橫桿分隔符了,這個時候我們需要進行處理一下,需要進行去判斷一下,如果我們迭代到的字符是最后一個字符,那么我們進行切片的時候,就應(yīng)該從哪個地方切呢? 從p開始 ,如果切到n,我們只能取到pytho,少切一個n,所以到n + 1的位置,好,知道這個流程我們就用代碼去實現(xiàn)這個算法
復(fù)制代碼 隱藏代碼
def split_s(string, sep="", num=0): split_words = []
last_index = 0 count = 0 for index, char in enumerate(string):
if count == num and num > 0:
split_words.append(string[last_index:len(string)])
break if char == sep:
split_words.append(string[last_index:index])
last_index = index + 1 count += 1 elif index + 1 == len(string):
split_words.append(string[last_index:index + 1])
return split_wordsprint(split_s("life-is-short-you-need-python",'-'))print(split_s("life-is-short-you-need-python",'-',2)) 題目16:大衍數(shù)列中國古代文獻中,曾記載過“大衍數(shù)列”,主要用于解釋中國傳統(tǒng)文化中的太極衍生原理 它的前幾項是:0、2、4、8、12、18、24、32、40、50... 其規(guī)律是:偶數(shù)項,是序號平方再除2,奇數(shù)項,是序號平方減1再除2。 打印大衍數(shù)列的前100項
復(fù)制代碼 隱藏代碼
for x in range(1,101):
if x % 2 == 0: a = int((x ** 2) / 2)
else: a = int((x ** 2 - 1) / 2)
print(a) 題目17:單詞分析小藍正在學(xué)習(xí)一門神奇的語言,這門語言中的單詞都是由小寫英文字母組成,有些單詞很長,遠遠超過正常英文單詞的長度。小藍學(xué)了很長時間也記不住一些單詞,他準備不再完全記憶這些單詞,而是根據(jù)單詞中哪個字母出現(xiàn)得最多來分辨單詞 現(xiàn)在,請你幫助小藍,給了一個單詞后,幫助他找到出現(xiàn)最多的字母和這個字母出現(xiàn)的次數(shù) 其實就是讓你輸入一段字符串后,得到當(dāng)前字符串出現(xiàn)最多的字母和它的次數(shù) 輸入:HelloWorld 輸出: l 3 我們可以對當(dāng)前的字符串進行循環(huán)迭代,然后把字符串當(dāng)前每個字符當(dāng)作key值,把它存到字典里面,如果當(dāng)前key在字典里面,我們就讓它加一,如果不在那我們就讓它的次數(shù)初始化為1,最終我們再從字典找到次數(shù)最多的key值和value值
復(fù)制代碼 隱藏代碼
def analyse_words(words): word_dict = {}
for i in words:
if i in word_dict:
word_dict[i] += 1 else:
word_dict[i] = 1 max_key = max(word_dict,key=word_dict.get)
print(max_key)
print(word_dict[max_key])
analyse_words('helloworld') 題目18:利用棧打印菱形輸入邊長n,打印對應(yīng)邊長的菱形
分析: 打印幾行 每一行打印幾個空格,幾個星星 前幾行打印之前加入到棧,利用棧的后進先出原則打印后幾行的內(nèi)容
復(fù)制代碼 隱藏代碼
def diamond(n): stack = []
for i in range(1, 2 * n):
if i <= n:
p_str = ' ' * (n - i) + '*' * (2 * i - 1)
if i != n:
stack.append(p_str)
print(p_str)
else:
print(stack.pop())
diamond(5) 題目19:深入理解遞歸函數(shù)什么是遞歸函數(shù)? 遞歸函數(shù)就是一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進入新的一層。 遞歸函數(shù)必須有結(jié)束條件。
設(shè)計遞歸函數(shù)三要素: 明確你這個函數(shù)想要干什么 尋找遞歸結(jié)束條件 找出函數(shù)的等價關(guān)系式
復(fù)制代碼 隱藏代碼
def p(n): if n == 0:
return print('遞歸前->',n)
p(n-1)
print('遞歸后->',n)
p(5) 題目20:斐波那契遞歸函數(shù)斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列,因數(shù)學(xué)家萊昂納多·斐波那契(Leonardo Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數(shù)列”,指的是這樣一個數(shù)列: 1、1、2、3、5、8、13、21、34、... 這個數(shù)列,前兩項都是數(shù)字1,從第三項開始,每一項數(shù)字是前兩項數(shù)字之和 關(guān)系表達式【f(n) = f(n-1)+f(n-2)】
復(fù)制代碼 隱藏代碼
def fib(n): if n<=2:
return 1 return fib(n-1)+fib(n-2)print(fib(10)) print(fib(2)) 遞歸與棧的關(guān)系 遞歸函數(shù)原理:每一次調(diào)用都會把當(dāng)前調(diào)用壓入到棧里,最后按照后進先出的原則,不停返回返回 由遞歸程序的執(zhí)行過程,我們得知遞歸程序的調(diào)用是一層層向下的,而返回過程則恰好相反,一層層向上。
換個說法:最先一次的函數(shù)調(diào)用在最后返回,而最后一次的函數(shù)調(diào)用則是最先返回。這就跟棧的“后進先出”次序是一樣的。因此,在實現(xiàn)遞歸調(diào)用的時候,通常就會使用棧來保存每一次調(diào)用的現(xiàn)場數(shù)據(jù): 題目21:三個數(shù)取最大數(shù)己知數(shù)字a,b,c分別為10,6,18 找出a,b,c中最大的數(shù)字(不借助函數(shù)以及列表等方式) 我們知道函數(shù)max可以直接獲取到最大值,或者可以把數(shù)字添加到列表里,通過排序也能獲取到最大數(shù)字,我們單純使用if分支來實現(xiàn)
復(fù)制代碼 隱藏代碼
a, b, c = 10, 6, 18if a > b:
max_num = aelse:
max_num = bif max_num < c:
max_num = cprint(max_num) 題目22:因子之和“完數(shù)”什么是因子? 因子就是所有可以整除這個數(shù)的數(shù)字,包括1但不包括這個數(shù)自身。比如8的因子有1,2,4 什么是完數(shù)? 一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”,打印輸出1000以內(nèi)的完數(shù),例如6=1+2+3,6就是“完數(shù)
復(fù)制代碼 隱藏代碼
def factor_sum(n): s_sum = 0 for i in range(1, n):
if n % i == 0:
s_sum += i
return s_sumfor j in range(1, 1000):
if j == factor_sum(j):
print(j)
題目23:遞歸階乘求和一個正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)之積,并且0的階乘為1
復(fù)制代碼 隱藏代碼
如5!=1*2*3*4*5
計算1!+2!+3!+4!+5!+…+10!
關(guān)系表達式【f(n) = n*f(n-1)】 復(fù)制代碼 隱藏代碼
def factor(n): if n < 2:
return 1 return n * factor(n - 1)
s_sum = 0for i in range(1, 11):
s_sum += factor(i)print(s_sum) 題目24:有效的括號給定一個只包括'(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足: 左括號必須用相同類型的右括號閉合 左括號必須以正確的順序閉合 空字符串可被認為是有效字符串
示例 1: 輸入:"()" 輸出:True 示例 2: 輸入:"()[]{}" 輸出:True 示例 3: 輸入:"(]" 輸出:False 示例 4: 輸入:"([)]" 輸出:False 解法一:字符串替換法 在字符串中找成對的()、[]、{},找到后替換成空 使用while循環(huán),不停判斷是否存在成對的小括號中括號大括號,如果存在就使用replace替換成空 直到無法再替換的時候,再判斷下當(dāng)前的字符串是否為空,如果為空說明字符串是有效的,如果不為空說明字符串是無效的
復(fù)制代碼 隱藏代碼
def valid_str(string): if len(string) % 2 == 1:
return False while '()' in string or '[]' in string or '{}' in string:
string = string.replace('()', '')
string = string.replace('[]', '')
string = string.replace('{}', '')
return string == ''print(valid_str('()')) print(valid_str('()[]{}')) print(valid_str('()[]{[()]}')) print(valid_str('()[]{[(}]}')) 解法二:利用棧的后進先出原則 先去定義一個空棧,對當(dāng)前棧進行循環(huán)遍歷,遇到左括號我們就把當(dāng)前的左括號添加到棧里面,遇到右括號,我們就和棧頂元素進行比對 看它們是不是成對的括號,如果是,就把當(dāng)前的元素出棧,直到字符串遍歷結(jié)束之后,我們再來看下字符串是不是空的,如果是空的說明字符串是有效的,如果不為空說明字符串是無效的
復(fù)制代碼 隱藏代碼
def valid_str(string): if len(string) % 2 == 1:
return False stack = []
char_dict = {
')': '(',
'}': '{',
']': '[' }
for char in string:
if char in char_dict:
if not stack or char_dict[char] != stack.pop():
return False else:
stack.append(char)
return not stackprint(valid_str('(){}[({[]})]')) print(valid_str('(){}[({[)})]')) print(valid_str('')) 題目25:回文數(shù)的兩種解法回文數(shù)是指正序(從左向右)和倒序(從右向左)都是一樣的整數(shù)。例如,1221是回文,而1222不是。
解法一:通過逆轉(zhuǎn)字符串進行比對 復(fù)制代碼 隱藏代碼
def is_palindrome(x): if x < 0 or x > 0 and x % 10 == 0:
return False str_x = str(x)
return str_x == str_x[::-1]print(is_palindrome(121)) print(is_palindrome(120)) 解法二:反轉(zhuǎn)一半數(shù)字和前半部分的數(shù)字進行比較 流程 數(shù)字長度(奇數(shù)) 12321 數(shù)字長度(偶數(shù)) 1221 復(fù)制代碼 隱藏代碼
def is_palindrome(x): if x < 0 or x > 0 and x % 10 == 0:
return False reverted = 0 while x > reverted:
reverted = reverted * 10 + x % 10 x //= 10 return x == reverted or x == reverted // 10print(is_palindrome(1221)) print(is_palindrome(1223)) print(is_palindrome(123321)) |