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.忘记限制输出的长度了!

本周刷题情况:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值