0x01.Python3.X 練習
來自專欄戀習Python4 人贊了文章
之前雖然也學過寫過Python,不過只是Python2.7,與Python3.X相比還是有較大不同的。最近通知訊傳來,不出意料的進入了CS專業,想著得趁暑假溫習一下,於是找了一套質量不錯的網課。與此同時,決定找套題庫加以訓練自己,雙線進行。從基礎開始,基礎不牢,地動山搖。
之後還會以同樣的形式來學習一下Rust,了解一些系統結構層面的知識。
print("Hello,world")
題庫的選擇
通過詢問學長,取得如下備選題庫列表:
+ Universal Online Judge + Vijos + Python Tip考慮到語言練習的針對性,決定選用Python Tip進行刷題。一共有174道題,預計在15天刷個大半,盡量全部完成( 期間可能還要抽時間準備駕校科目一的考試)。廢話不多說,咱開始吧。
習題解法
0x01. a+b
a=int(input("a的值是?"))b=int(input("b的值是?"))print("a+b=",a+b)
- 與2.7版本不太一樣的是,3中print改為了函數;通過查找doc也可以發現print函數提供了一些參數來滿足日常需要,如:是否換行等等。
- 丟棄了raw_input
- input後得到的值默認類型是字元串,為了使被賦值的變數最終可以參與計算,初步有以下兩種做法:
- 在前嵌套int函數
- 在前嵌套eval函數
0x02. 列表排序
給你一個列表 L, 對L進行升序排序並輸出排序後的列表。
help(list.sort)help(sorted)l=[1,4,2,3,7,5,4]print(l)sorted(l)print(l)l.sort()print(l)l.sort(reverse=True)print(l)
- 區別sorted與list.sort的區別,用sort函數對列表排序時會影響列表本身,而sorted不會;
- reverse參數用於控制順倒序排序,默認值為False進行遞增排序,若改為True則遞減.
0x03.字元串逆序
給你一個字元串 a, 請你輸出逆序之後的a。
考慮通過字元串轉數組再逆序分片
help(str.join)strA= input("輸入需要逆序的字元串")l=[]for i in strA: l.append(i)l=list(strA)l.reverse()print ("".join(l))
此處複習了一下join的用法,即我們採用空字元串.join(數組)的方法將數組轉為了字元串.
採用索引的方法
strA= input("輸入需要逆序的字元串")print(strA[::-1])
完全分片後設置負步長,代碼簡單了許多。
0x04.輸出字典鍵
給你一字典一個,如A = {1:1,2:2,3:3}。,輸出字典一個的鍵,以","連接,如 1,2,3要求鍵按照字典搜索序升序排列(注意關鍵可能是字元串)。
#testa=input("請輸入一個字典")print(type(a))#testa=eval(input("請輸入一個字典"))print(type(a))a=eval(input("請輸入一個字典"))for key,value in a.items(): print(key,end=",") #print(value,end=",")
這裡採用字典鍵值對應解包再單獨輸出的方法解決,仍然有一點不足之處,就是末尾的","與題設不符合。
a=eval(input("請輸入一個字典"))s=""for key,value in a.items(): s=s+","+str(key)s=s[1:]print(s)
我得承認這種做法美感全無,先將就著,後期再改。
0x05.輸出字元奇數位置的字元串
給你一個字元串 a, 輸出a中奇數位置字元構成的字元串(位置編號從1開始)。
strA=input("請輸入一個字元串")for i in range(0,len(strA)): if i%2==0: print(strA[i:i+1],end="")
常規採用字元串分片方法來實現。
0x06.求解100以內所有的素數
輸出100以內所有的素數,素數之間用空格區分。
for i in range(2,101): flag=True for j in range(2,int(i/2)+1): if i%j==0: flag=False break if flag: print(i,end=" ")
這是一種常規的做法,通過for語句嵌套,逐個判定後再輸出。
0x07.求矩形面積
已知矩形長a,寬b,輸出其面積和周長,面積和周長以一個空格隔開。
a,b=eval(input("長方形的長與寬分別是?"))print(a*b,2*(a+b),end=" ")
0x08.求中位數
給你一個整數列表L, 輸出L的中位數(若結果為小數,則保留一位小數)。
l=eval(input("請輸入一個序列"))l.sort()print(l)if (len(l)+1)%2==1: print((l[(len(l)+1)//2-1]+l[(len(l)+1)//2])/2)else: print(l[(len(l)+1)//2-1])
0x09.最大公約數
給你兩個正整數a和b, 輸出它們的最大公約數。
a,b=eval(input("請輸入一組數a,b"))a,b=max(a,b),min(a,b)while a*b!=0: a,b=b,a%bprint(a)
這一段寫的很Python,充分體現了Python的簡潔。
0x0a.最小公倍數
給你兩個正整數a和b, 輸出它們的最小公倍數。
def gys(a,b): a,b=max(a,b),min(a,b) while a*b!=0: a,b=b,a%b return aa,b=eval(input("請輸入一組數a,b"))print(a*b//gys(a,b))
0x0b.結尾0的個數
給你一個正整數列表L,輸出L內所有數字的乘積末尾0的個數。
l=eval(input("請輸入一個序列"))print(l.count(0))
不像是道Python題...
0x0c.結尾非零數的奇偶性
給你一個正整數列表L,判斷列表內所有數字乘積的最後一個非零數字的奇偶性。如果為奇數輸出1,偶數則輸出0。
l=eval(input("請輸入一個序列"))s=1for i in l: s=s*i s=int(str(int(str(s)[::-1]))[0])print(s%2)
這顯然不是最優的解法,我是想在有限內存下做一個能保存最後一個非零數的另類版本(好吧就是我題目看錯了...)。本題要考慮序列中是否含0的情況,加個if語句即可,在此不贅述。
0x0d.光棍的悲傷
光棍們對1總是那麼敏感,因此每年的11.11被戲稱為光棍節。小Py光棍幾十載,光棍自有光棍的快樂。讓我們勇敢地面對光棍的身份吧,現在就證明自己:給你一個整數a,數出a在二進位表示下1的個數,並輸出。
a=int(input("輸入一個數"))print(list(bin(a)).count(1))
大概只知道int,不知道bin,oct,hex的存在?
0x0e.Python之美
輸出Python之禪。
注意:輸出python之禪的源碼即可,不要轉換為英文。(小小的提示:print this.s)import thisprint(this.s)
優秀。
0x0f.大小寫轉換
給定一個字元串a, 將a中的大寫字母 轉換成小寫,其它字元不變,並輸出。
a=input("輸入一個字元串")print(a.upper())
運用Python字元串內建屬性.upper來實現,類似的還有.lower來轉小寫。
0x10.人民幣金額列印
銀行在列印票據的時候,常常需要將阿拉伯數字表示的人民幣金額轉換為大寫表示,現在請你來完成這樣一個程序。
在中文大寫方式中,0到10以及100、1000、10000被依次表示為:零壹貳叄肆伍陸柒捌玖拾佰仟萬。現在給你一個整數a(|a|<100000000), 請你列印出人民幣大寫表示。a=input("輸入金額")num={0:零, 1:壹, 2:貳, 3:叄, 4:肆, 5:伍, 6:陸, 7:柒, 8:捌, 9:玖}word=[ "仟", "佰", "拾", "萬", "仟", "佰", "拾", "圓"]b=a.zfill(8)def read4(k): t=num[k[0]]+word[4]+num[k[1]]+word[5]+num[k[2]]+word[6]+num[k[3]] t=t.replace("零拾","零") t=t.replace("零佰","零") t=t.replace("零仟","零") t=t.strip("零") return(t)if len(a)<4: print(read4(b[4:])+word[7])elif b[4]=="0": print(read4(b[0:4])+word[3]+num["0"]+read4(b[4:])+word[7])else: print(read4(b[0:4])+word[3]+read4(b[4:])+word[7])
為了方便表達,在此不加入金額為負的讀取方式,實際改良其實很簡單。
要承認這道題花了點時間,不是因為題目太難,而是看到平台上有人想了一天想出了一種僅用47行就能表述的方法。我的想法是:這麼一道小題為什麼要用47行?故思之,運用了Python在字元串處理方面的強大能力,19行就解決了這個問題。這裡用到了.zfill,.replace,.strip等方法。
0x11.公約數的個數
給你兩個正整數a,b, 輸出它們公約數的個數。
a,b=eval(input("輸入一組a,b"))setofa={1,a}setofb={1,b}def gys(x,s): for i in range(2,x//2+1): if x%i==0: s.update([i,x//i]) return(s)print(len(gys(a,setofa) & gys(b,setofb)))
這裡我們複習了一下幾何方法,以取交集的形式直接求得了公共因子集。當然,也可以藉助math組建中的sqrt函數來減少無用計算量,但為了盡量減少對庫的使用,沒有這麼做。
0x12.逆解最大公約數與最小公倍數
我們經常遇到的問題是給你兩個數,要你求最大公約數和最小公倍數。今天我們反其道而行之,給你兩個數a和b,計算出它們分別是哪兩個數的最大公約數和最小公倍數。輸出這兩個數,小的在前,大的在後,以空格隔開。若有多組解,輸出它們之和最小的那組。註:所給數據都有解,不用考慮無解的情況。
import matha,b=eval(input(("輸入一組a,b")))a,b=min(a,b),max(a,b)t=int(b/a)for i in range(int(math.sqrt(t))+1,t+1): if t%i==0: breakprint(str(a*int(t/i))+" "+str(a*i))
用了一些基本的數學處理,解決了這個問題。
0x13.單身情歌
抓不住愛情的我 總是眼睜睜看它溜走 ...現在來練習一下發現愛的能力,給你一個字元串a,如果其中包含"LOVE"(love不區分大小寫)則輸出LOVE,否則輸出SINGLE。
a=input("輸入一個字元串")
a=a.lower()if "love" in a: print("LOVE")else:
print("SINGLE")論一個CS本科生的基本素養...
0x14.信息加密
給你個小寫英文字元串a和一個非負數b(0<=b<26), 將a中的每個小寫字元替換成字母表中比它大b的字母。這裡將字母表的z和a相連,如果超過了z就回到了a。
a=input(請輸入一個小寫字元串)b=int(input(請輸入一個非負整數b))a=list(a)for i in a: i=chr(ord(i)+b%26) print(i,end="")
大概是浙江考生學了VB的好處。
## 0x15.迴文子串 給你一個字元串a和一個正整數n,判斷a中是否存在長度為n的迴文子串。如果存在,則輸出YES,否則輸出NO。迴文串的定義:記串str逆序之後的字元串是str1,若str=str1,則稱str是迴文串,如"abcba".a=input("請輸入一個字元串")n=eval(input(輸入長度))b=a[::-1]f=Falsefor i in range(1,len(a)+2-n): if a[i:i+n-1] in b: print(YES) f=True breakif not f: print(NO)
採用索引實現逆序後採取成員檢測的方案。
0x16.時間就是金錢
給你兩個時間st和et(00:00:00<=st <= et<=23:59:59), 請你給出這兩個時間間隔的秒數。
st=input(輸入第一個時間)et=input(輸入第二個時間)stnum=int(st[6:])+int(st[3:5])*60+int(st[0:2])*3600etnum=int(et[6:])+int(et[3:5])*60+int(et[0:2])*3600print(etnum-stnum)
有些暴力,但沒什麼毛病吧。
0x17.365 OR 366
一年有多少天,這是個大問題,很值得思考。現在給你一個年份year(year為四位數字的字元串,如"2008","0012"),
你輸出這一年的天數。如year="2013", 則輸出365。year=input(year=?)if int(year)%4==0 and int(year)%100 !=0: print(366)else: print(365)
exm...
0x18.一馬當先
下過象棋的人都知道,馬只能走日字形(包括旋轉90°的日),現在想像一下,給你一個n行m列網格棋盤,
棋盤的左下角有一匹馬,請你計算至少需要幾步可以將它移動到棋盤的右上角,若無法走到,則輸出-1.如n=1,m=2,則至少需要1步;若n=1,m=3,則輸出-1。解答已給出,參考博文:
eEhy:「一馬當先」問題的一種BFS剪枝解答
m,n=int(input("輸入m行")),int(input("輸入n列"))def move(loc,i): locs=loc[:] if i==1: locs[0],locs[1]=loc[0]-2,loc[1]+1 elif i==2: locs[0],locs[1]=loc[0]-1,loc[1]+2 elif i==3: locs[0],locs[1]=loc[0]+1,loc[1]+2 elif i==4: locs[0],locs[1]=loc[0]+2,loc[1]+1 elif i==5: locs[0],locs[1]=loc[0]+2,loc[1]-1 elif i==6: locs[0],locs[1]=loc[0]+1,loc[1]-2 elif i==7: locs[0],locs[1]=loc[0]-1,loc[1]-2 elif i==8: locs[0],locs[1]=loc[0]-2,loc[1]-1 return locsdef solve(): global m,n temp=[[],[[0,0]],[]] t=1 f=True while f: f=False for loc in temp[1]: for i in range(1,9): if move(loc,i)==[m,n]: return t elif move(loc,i)[0]>=0 and move(loc,i)[1]>=0 and move(loc,i)[0]<=m and move(loc,i)[1]<=n and not(move(loc,i) in temp[0] or move(loc,i) in temp[1] or move(loc,i) in temp[2]): temp[2].append(move(loc,i)) f=True t+=1 del temp[0] temp.append([]) return -1print(solve())輸入m行4輸入n列84
eEhyQx/WeCreate
推薦閱讀:
※利用Python尋找命中注定的另一半, 大家都覺得不可信, 畢竟都還沒看這篇神級教程!
※Scrapy 爬取 網易考拉 動態載入 解析json 獲取商品詳情
※列表
※Python3 pandas(4) 讀寫excel,使用書籤
※Python3 pandas (6)計數value_counts()