python刷題第二周


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.忘記限制輸出的長度了!

本周刷題情況:

在這里插入圖片描述


免責聲明!

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



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