+12 投票
分类:编码思路 | 用户: 9 4 3 (2.5k 分)
修改于 用户:

【问题描述】

计算某研究者的文章引用指数h。根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。

【输入形式】

以数组形式(英文中括号包裹,中间英文,分割)输入一行自然数数组,表示某研究者的文章引用次数。

【输出形式】

一个整数

【样例输入】

[1,2,3,4,5,6,7,8]

【样例输出】

4

#H指数

def hIndex(citations):

    citations = list(map(int, citations))

    citations.sort()

    num = len(citations)

    for i in range(0,len(citations)):

        if citations[i]>=num:

            return num

        num -= 1

    return num

nums = input()

nums = nums[1:-1]

num = nums.split(',')

nums = hIndex(num)

print(nums)

4 个回答

0 投票
用户: 9 2 1 (380 分)

麻烦大家看一下哪里有问题 

def hindex(indexlist):
    li = []
    indexset = sorted(list(set(indexlist)),reverse=True)
    for index in indexset:
        #记被引用次数大于等于该数的文章
        clist = [i for i in indexlist if i >= index]
        if index < len(clist):
            break
        else:
            li.append(int(index))
    return max(li)

test = input('请输入一个列表: ')
print(hindex(test))
用户: 10 8 4 (2.7k 分)
以样例输入为例,你input进去的是一个字符串而没办法直接读进一个列表啊。要先预处理一下的
否则你的set(indexlist)里的元素有‘1’~‘8’;和 '[' , ']' 和  ','这几个字符
其次你放在indexset里的都是'1','2'这样的字符串,要用的话得加int
(比如你的index<len(clist))
也还是预处理的问题

假设你已经把它处理成一个理想的列表
那也不行啊
你的算法是把被引量从高到低遍历,直到被引量高于index的篇数即len(clist)也大等于index,这个时候的index就是你想要的结果,因为再往下取len(clist)单增index单减不等式恒成立
所以你最后应该取的是你刚好没放进列表 li 里的那一个index
<注1:注意是index<=len(clite),你用的是小于>
改完的算法部分代码:
def hindex(indexlist):
    indexset = sorted(list(set(indexlist)),reverse=True)
    for index in indexset:
        #记被引用次数大于等于该数的文章
        clist = [i for i in indexlist if i >= index]
        if index <= len(clist):
            return index

test =[1,2,3,4,5,6,7,8]#几组验证用样例
print(hindex(test))
test =[1,2,3,4,5,6,7]
print(hindex(test))
test=[2,3,3,3]
print(hindex(test))

至于怎么得到理想的数字列表
呃我的办法很笨拙,掐头去尾之后转进列表然后重写一个逐个读入重写一个列表
list1=(input()[1:-1]).split(',')
for i in range(len(list1)):
    list1[i]=int(list1[i])
print(list1)
希望有人给更好的方法√^◡^
+2 投票
用户: 7 3 2 (700 分)
info = str(input()) #样例输入
info = info[1:-1] #去除括号
lst = info.split(',')#将数装入列表

int_lst = []#将列表里的元素转换为整数型
for a in lst:
    a = int(a)
    int_lst.append(a)

targets = []
for target in int_lst:
    higher_times = 0
    for cite in int_lst:
        if cite >= target:
            higher_times += 1
    if higher_times >= target:
        targets.append(target)

result = 0
for target in targets:
    if target >= result:
        result = target

print(result)




+2 投票
用户: 6 3 1 (430 分)

passage = input("请输入各篇文章的引用次数")
passage = passage.replace("[","").replace("]","").split(",")
n = len(passage)
h = 0
for i in range(1,n+1):
    m = 0
    for j in range(0,n):
        if int(passage[j]) >= i:
            m += 1
    if m >= i:
        h = i
print(h)

0 投票
用户: 5 1 (530 分)
times=eval(input())
n=len(times)
max=max(times)
hs=[0 for i in range(max+1)]
for i in range(max+1):
    for j in range(n):
        if times[j]>=i:
            hs[i]+=1
h=0
for i in range(max+1):
    if i<=hs[i]:
        h=i
print(h)
欢迎来到 在线问答系统 ,有什么不懂的可以尽管在这里提问,你将会收到社区其他成员的回答。
...