1:
第3章-5 字符轉換 (15 分) 本題要求提取一個字符串中的所有數字字符('0'……'9'),將其轉換為一個整數輸出。
輸入格式: 輸入在一行中給出一個不超過80個字符且以回車結束的字符串。
輸出格式: 在一行中輸出轉換后的整數。題目保證輸出不超過長整型范圍。
我的代碼:
import re
string = input()
res = re.findall("[0-9]", string)
for i in range(len(res)):
print(res[i], end="")
我利用了正則表達式中的re.findall函數,將找到的數字放入列表中,最后將列表輸出。
經過多次測試,我並沒有發現什么問題,但是卻有一個測試點無法通過,求大佬解答。
別人的代碼:
1.
s = input()
n = ''
for i in s:
if i.isnumeric():
n += i
print(int(n))
這里ta利用了isnumeric()函數來判斷字符是不是數字。
2.
s=input()
su=0
for i in range(0,len(s)): #確定好range函數的范圍
if "0"<=s[i]<="9":
su=su*10+int(s[i])
print(su)
這里ta簡單地通過"0"<=s[i]<="9"來判斷該字符是否是數字。
我當時試過0<=s[i]<=9,但是執行時會報錯說str類型和int類型不能比較,所以以后我會采用ta的方法。
2:
第3章-9 字符串轉換成十進制整數 (15 分)
輸入一個以#結束的字符串,本題要求濾去所有的非十六進制字符(不分大小寫),組成一個新的表示十六進制數字的字符串,然后將其轉換為十進制數后輸出。如果在第一個十六進制字符之前存在字符“-”,則代表該數是負數。輸入格式: 輸入在一行中給出一個以#結束的非空字符串。
輸出格式: 在一行中輸出轉換后的十進制數。題目保證輸出在長整型范圍內。
代碼:
s=input()
su=0
for i in range(0,len(s)+1):
if s[i]=="#":
break
if "0"<=s[i]<="9":
su=su*16+int(s[i])
elif "a"<=s[i]<="f":
su=su*16+int(s[i],16)
elif "A"<=s[i]<="F":
su=su*16+int(s[i],16)
for j in range(0,len(s)):
if "0"<=s[j]<="9" or "a"<=s[j]<="f" or "A"<=s[j]<="F":
break
if j>s.find("-"):
su=-su
print(su)
思考:
我一開始想的是先把十六進制之外的數先刪除,然后再對剩下的數進行進制轉換,但是遇到了很多困難,比較難實現。
如果把遇到的每個十六進制數都加起來,就相對比較簡單。
3:
第3章-13 字符串替換 (15 分) 本題要求編寫程序,將給定字符串中的大寫英文字母按以下對應規則替換:
原字母 對應字母 A Z B Y C X D W … … X C Y B Z A 輸入格式:
輸入在一行中給出一個不超過80個字符、並以回車結束的字符串。輸出格式: 輸出在一行中給出替換完成后的字符串。
代碼:
num = input()
for i in range(len(num)):
if (num[i] >= "A") and (num[i] <= "Z"):
print(chr(155-ord(num[i])), end="")#ord():將字符轉換成ascii碼,chr()將整數轉換成對應的數字
else:
print(num[i], end="")
我學到了:
1.主要利用了轉換前后的字母的ascii碼的和都為155。
2.ord()函數將字符轉換成ascii碼
3.char()將ascii碼轉換為字母
3:
第3章-19 找最長的字符串 (15 分) 本題要求編寫程序,針對輸入的N個字符串,輸出其中最長的字符串。
輸入格式: 輸入第一行給出正整數N;隨后N行,每行給出一個長度小於80的非空字符串,其中不會出現換行符,空格,制表符。
輸出格式: 在一行中用以下格式輸出最長的字符串:
The longest is: 最長的字符串
代碼:
n = int(input())
result = ""
number = 0
for i in range(n):
string = input()
if len(string)>number:
number = len(string)
result = string
print("The longest is: %s"%result)
思考:
1.我開始的方向錯誤了,想着收入n后,寫一個for循環將n個string放入列表中,但是我發現這樣比較麻煩。
4:
第3章-16 刪除重復字符 (20 分) 本題要求編寫程序,將給定字符串去掉重復的字符后,按照字符ASCII碼順序從小到大排序后輸出。
輸入格式: 輸入是一個以回車結束的非空字符串(少於80個字符)。
輸出格式: 輸出去重排序后的結果字符串。
代碼:
ls = input()
ls = list(ls)
ls = sorted(ls)
i = 0
while i < len(ls) - 1:
if ls[i] == ls[i + 1]:
ls.pop(i)
i -= 1
i += 1
print("".join(ls))
思考:
1.這道題的思路很簡單,就是先把字符串分解為字符數組,然后再把又重復的字符刪除就可以了。
2.但是有個易錯點是:如果對列表有刪除的操作,不能用for語句,因為for語句中的i是固定增加的,會導致檢索過程中元素的遺漏,使用while循環是更好的選擇。
5:
第3章-18 輸出10個不重復的英文字母 (30 分) 隨機輸入一個字符串,把最左邊的10個不重復的英文字母(不區分大小寫)挑選出來。
如沒有10個英文字母,顯示信息“not found”輸入格式: 在一行中輸入字符串
輸出格式: 在一行中輸出最左邊的10個不重復的英文字母或顯示信息“not found"
我的代碼:
ls = input()
ls = list(ls)
res = []
for i in range(len(ls)):
if "A" <= ls[i] <= "z":
res = "".join(res)
if ls[i].upper() not in res and ls[i].lower() not in res:
res = list(res)
res.append(ls[i])
if len(res) < 10:
print("not found")
else:
print("".join(res))
我感覺大概是沒問題的,但是卻有一個測試點沒通過,找不到原因。
ps:我找到原因了!
問題就在於這里:
else:
print("".join(res))
我忘記考慮字符串長度超過10的情況了,如果這樣我就會輸出超過10個字母,當然錯了啦
因此改成這樣就對了:
for i in range(0,10):
print(s[i],end="")
別人的代碼:
s1=input()
s=list()
count=0
for i in s1:
if i.isalpha() and i.lower() not in s and i.upper() not in s:
s.append(i) #注意一點語法:s=s.append()是初學者易犯的錯誤
count=count+1
if count<10:
print("not found")
else:
for i in range(0,10):
print(s[i],end="")
思考:
他的思路和我基本一致,但是很明顯他寫的更簡單,因而更不容易出錯。
1.他利用了isalpha()函數判斷是不是英文字母,這是我沒想到的。
2.忘記限制輸出的長度了!