PAT (Basic Level) Practice 1083 是否存在相等的差 (20 分) Python解法

目录

    • 一、题目
    • 二、输入输出
    • 三、样例
    • 四、题目分析

一、题目

给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差?

二、输入输出

输入格式:
输入第一行给出一个正整数 N(2 ≤ N ≤ 10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。

输出格式:
按照“差值 重复次数”的格式从大到小输出重复的差值及其重复的次数,每行输出一个结果。

三、样例

输入样例:
8
3 5 8 6 2 1 4 7
输出样例:
5 2
3 3
2 2

四、题目分析

题目简单,但如果不使用sort(d.items())这个用法就会WA,具体原因未知,烦请大佬解答为什么第一种过不了。

代码1:

N= int(input())
d = dict()
c = [int(i) for i in input().split()]
for j in range(N):
    e = abs(j+1-c[j])
    if(str(e) in d.keys()):
        d[str(e)]+=1
    else:
        d[str(e)]=1
r = []
for k, v in d.items():
    if(v!=1):
        r.append('{} {}'.format(k, v))
for i in r[::-1]:
    print(i)

PAT (Basic Level) Practice 1083 是否存在相等的差 (20 分) Python解法_第1张图片
AC代码(两者只差了后面几行不一样):

N= int(input())
d = dict()
c = [int(i) for i in input().split()]
for j in range(N):
    e = abs(j+1-c[j])
    if(str(e) in d.keys()):
        d[str(e)]+=1
    else:
        d[str(e)]=1
li = list(d.items())#生成列表:元素为(键,值)形式
li.sort(reverse = True)#倒序
for a, b in li:
    if b != 1:
        print(a, b)#过滤未重复的差值

PAT (Basic Level) Practice 1083 是否存在相等的差 (20 分) Python解法_第2张图片

你可能感兴趣的:(PTA(Programming,T,Assistant),python,算法,贪心算法)