以下是有所收获的题目:
第一题
第5章-10 两数之和 (30 分)
给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 “no
answer”。输出的下标按从小到大排序。用一重循环加字典实现。输入格式: 在一行中给出这组数。 在下一行输入目标数
输出格式: 在一行中输出这两个数的下标,用一个空格分开。
我的代码:
ls = list(map(int, input().split(",")))
i = int(input())
length = len(ls)
for x in range(length):
for y in range(x, length):
if ls[x] + ls[y] == i:
print("{} {}".format(x, y))
exit(0)
else:
print("no answer")
我的代码可以实现题目的要求结果,但是却没有按照题目的具体要求:一重循环,用字典来解决这个问题。
别人的代码:
#本题思路:将目标数字减去第一行输入的每一个数字,然后将其存入到字典dict1当中;
#items()函数,可以遍历字典,从而取出其中的key和value值;
#list1.index()输出值对应的角标;
#用到了一个for/else语句块,当for循环中的语句不输出的时候,执行else中的语句;
list1 = list(map(int,input().split(",")))
num = int(input())
dict1 = {}
for i in list1:
dict1[i] = num - i
for key,value in dict1.items():
if(key in list1 and value in list1):
print("%d %d"%(list1.index(key),list1.index(value)))
break
else:
print("no answer")
exit(0)
————————————————
版权声明:本文为CSDN博主「10011111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43788669/article/details/105610592
思考:
for i in list1:
dict1[i] = num - i
这一步是比较关键的,将数字和目标数字的差成功对应起来,放到字典中,这样如果列表中存在字典中的值,那么就可以找出具体的位置了。
for key,value in dict1.items():
if(key in list1 and value in list1):
print("%d %d"%(list1.index(key),list1.index(value)))
break
这里利用了字典的items函数,可以遍历字典中的键和对应的值。
我觉得key in list1
这一句可以删掉,因为key肯定在list里面呀,而只要value在list里,就通过list.index()*函数找到该元素的位置,输出就可以了。
第二题
第5章-11 字典合并 (40 分)
字典合并。输入用字符串表示两个字典,输出合并后的字典,字典的键用一个字母或数字表示。注意:1和‘1’是不同的关键字!输入格式: 在第一行中输入第一个字典字符串 在第二行中输入第二个字典字符串
输出格式: 在一行中输出合并的字典,输出按字典序。"1"的ASCII吗为49,大于1,排序时1在前,"1"在后,其它的也一样。
我的代码:
dict1 = eval(input())
dict2 = eval(input())
for key, value in dict2.items():
if key in dict1:
dict1.update({key: value + dict1[key]})
else:
dict1.update({key: value})
print(dict1)
我的代码仅能实现基本功能,但是数字和字符如何处理还不清楚。
别人的代码:
思路:
对于字典里的键值,必须是数字在前,字母在后,由于python不能把数字和字母之间进行大小写比较,因此可以构造两个列表list_dig、list_wor,分别存储两个字典中的数字和字母键,分别sort之后拼接到一起。
在循环遍历的同时将两个字典里的键值对放到一个新的字典dic里,相同键合并,最后按照格式要求输出即可。
s1=eval(input())
s2=eval(input())
list_dig=[]
list_wor=[]
dic={}
for i in s1:
dic[i]=dic.get(i,0)+s1.get(i,0)
if type(i)==type(1):
list_dig.append(i)
elif type(i)==type('w'):
list_wor.append(i)
for i in s2:
dic[i] = dic.get(i, 0) + s2.get(i, 0)
if type(i)==type(1):
list_dig.append(i)
elif type(i)==type('w'):
list_wor.append(i)
list_dig.sort();list_wor.sort()
list=list_dig+list_wor
print("{",end="")
cnt=0;length=len(dic)
for i in list:
if i in dic:
cnt += 1
if type(i)==type(1):
print("{}:{}".format(i,dic[i]),end="")
else:
print('"{}":{}'.format(i,dic[i]),end="")
del dic[i]
if cnt!=length:
print(",",end="")
print("}")
————————————————
版权声明:本文为CSDN博主「WhlittLou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43301333/article/details/104015714
第三题
第6章-2 一帮一 (15 分)
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
别人的代码:
n = int(input())
s = []
for i in range(n):
x = list(input().split())
s.append(x)
s1 = s[:int(n/2)]
s2 = s[n-1:int(n/2)-1:-1]
for i in s1:
for j in s2:
if i[0] != j[0]:
print(i[1], j[1])
s2.remove(j)
break
思考:
1.这道题困扰我的点在于不知道如何处理性别和名字,如果将整个数据转化为二维数组就很好解决了。
先通过x = list(input().split())
将每个人的性别和名字作为一个数组,再通过s.append(x)
将每个人append进s数组中,这样就形成了一个二维数组。
2.
s1 = s[:int(n/2)]
s2 = s[n-1:int(n/2)-1:-1]
这段代码的作用是将一个列表切分为两半,便于进行后面的处理。
第四题
第6章-3 列表或元组的数字元素求和 (20 分) 求列表中数字和,列表中嵌套层次不限2层
输入格式: 在一行中输入列表或元组
输出格式: 在一行中输出数字的和
别人的代码:
def f(x):
su=0
if type(x)==int:
su=su+x
if type(x)==list or type(x)==tuple:
for i in x:
su=su+f(i)
return su
x=eval(input())
print(f(x))
————————————————
版权声明:本文为CSDN博主「仗剑倚天涯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45948920/article/details/104900331
思考:
1.函数的递归调用是这道题的关键
2.通过type()函数来判断变量类型,进而来选择是否要继续递归