Hackerrank 代码不工作
这个问题可以在这里找到。
我正在用Python编程,下面是我的代码:
num =raw_input()
li=list()
count=150*[0]
ans=0
while num>0:
li.append(raw_input())
num=int(num)-1
for i in range (0, len(li)):
for j in range(0, len(li[i])):
count.insert (ord(li[i][j]), count[ord(li[i][j])]+1)
for i in range(0, len(count)):
if count[i]==len(li):
ans=ans+1
print ans
在运行示例测试时,输出结果是3,而不是2。
我哪里出错了呢?
3 个回答
0
你把 c
当作一个宝石元素来计算。它出现了3次,但并不是在3行不同的地方。因此, count[i]==len(li)
这个条件并不足以判断它是一个宝石元素。
2
网站上说:所需知识:实现,集合:时间复杂度:O(n)
所以使用 set.intersection
会是一个更好的选择:
num = raw_input()
sets = [set(raw_input()) for x in range(int(num))] ]# make set from each line
print len(set.intersection(*sets)) # find letters that are common in all sets and print the length
2
你的程序有几个问题。
首先,你的插入方法并没有像你想的那样工作。
list.insert(i, x)
这个方法是在指定的位置插入一个项目。第一个参数是插入位置的索引,所以 a.insert(0, x) 是在列表的最前面插入,而 a.insert(len(a), x) 相当于 a.append(x),就是在列表的最后面添加。
其次,你试图统计每个字母出现的次数,而不仅仅是每行中的第一次出现。
这看起来也像是一个用心不够的问题,所以你才会收到负评价。你尝试过什么呢?
这里有一个正确使用你方法的解决方案,但这仍然不是一种很“pythonic”的方式。你有没有考虑过用字典来跟踪这些信息呢?
num = raw_input()
li = list()
count = 150*[0]
seen = 150*[False]
ans = 0
while num > 0:
li.append(raw_input())
num = int(num)-1
for i in range(0, len(li)):
for j in range(0, len(li[i])):
if (not seen[ord(li[i][j])]):
count[ord(li[i][j])] += 1
seen[ord(li[i][j])] = True
seen = 150*[False]
print count
for i in range(0, len(count)):
if count[i] == len(li):
ans = ans+1
print chr(i)
print ans
这里是用更“pythonic”的方式实现的,难道这不是更容易理解吗?
num = raw_input()
lines = []
seen = set()
count = {}
while num > 0:
lines.append(raw_input())
num = int(num)-1
for line in lines:
for char in line:
if (char not in seen):
count[char] = count.get(char, 0) + 1
seen.add(char)
seen = set()
print count
print list(count.values()).count(len(lines))
当然,还有更好的方法可以做到这一点。