鱼C论坛

 找回密码
 立即注册
查看: 7901|回复: 52

[技术交流] 鱼C论坛Python精英挑战赛(第四季03期)

[复制链接]
发表于 2017-12-6 11:48:49 | 显示全部楼层 |阅读模式
本帖最后由 jerryxjr1220 于 2017-12-11 11:40 编辑

第四届鱼C论坛精英挑战赛开始咯!为了增加趣味性,本届仍然延续“新玩法”-- “押宝玩法”,“竞猜玩法”和“擂主玩法”。

同时,根据以往鱼油的反馈,精英赛题目普遍偏难,所以参与的鱼油相对较少。为了提高大家的参与度,本届挑战赛会大幅降低难度,使大部分鱼油都能参赛。同时,会增设一、二、三名奖励,第一名奖励50鱼币,第二名30鱼币,第三名20鱼币。

新玩法规则:

1. 押宝玩法:由于押宝玩法参与人数很少,故暂停押宝。后续有改进玩法,会再公布。

2. 竞猜玩法:直接在比赛帖的下方进行投票,凡事“竞赛”获胜者,将奖励5鱼币。竞猜无门槛,人人都可以参与。竞猜以后,请在本帖留个言,方便领取奖励。

3. 擂主玩法:上一期挑战成功的鱼油成为挑战赛的擂主,擂主有优先权提议下一期的赛题,一届挑战赛共分5期,同一届中当擂主最长的鱼油有额外奖励。

本期题目: 下一个包含有相同数字的整数

给定一个正整数m,请输出下一个包含有相同数字的整数n. 如果n不存在,则输出None.
要求: n是由m中的数字经过不同的排序后得到,而且n>m。如果存在k,也是由m中的数字经过不同的排序后得到,而且k>m,则必须满足n<k

求下一个包含有相同数字的整数。
def next_int(m):
    '''your code here'''
    return n

要求: 结果正确,程序效率高,代码简洁

注:给定的m可能会有10位数字或以上,请注意运算效率

截止日期: 12月10日24时

本期擂主: 蓝色王魂  

@小甲鱼 @冬雪雪冬 @~风介~ @SixPy

提供几组测试数据及答案,可以自行对照:
输入m = 24531,输出n = 25134 #因为25134是24531的一个排列,并且25134>24531,并且25134正好是下一个比24531大的不同排列的整数。
输入m = 54321,输出n = None
输入m = 28543211,输出n = 31122458

竞猜:回答正确的参赛者的人数
单选投票, 共有 35 人参与投票
54.29% (19)
45.71% (16)
您所在的用户组没有投票权限

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-6 16:30:05 | 显示全部楼层
本帖最后由 yjsx86 于 2017-12-6 16:48 编辑
def next_int(m):
    m = [int(x) for x in str(m)]
    if m[0] > max(m[1:]):
        return None
    temp, i, n, flag = 0, -1, [], True
    while flag:
        for j in range(len(n)):
            if m[i] < n[j]:
                temp = n[j]
                n[j] = m[i]
                n.insert(0,temp)
                n = m[:i] + n
                flag = False
                break
        if flag:
            n.append(m[i])
            i -= 1
    rs = 0
    for k in range(len(n)):
        rs = rs*10 + n[k]
    return rs

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-6 21:24:49 | 显示全部楼层
def next_int(m):
    m_list = list(map(int,list(str(m))))
    t_list = [m_list[-1]]
    

    for index, item in enumerate(reversed(m_list)):
        if index:
            if item >= t_list[0]:
                t_list.insert(0,item)
            else:
                m_list[-index-1] = min(x for x in t_list if x > item)
                t_list[t_list.index(min(x for x in t_list if x > item))] = item
                break
        if index == len(m_list)-1: return None
    n = m_list[0:len(m_list)-len(t_list)]+sorted(t_list)

                
    return ''.join(list(map(str,n)))

print(next_int(24531))  #25134
print(next_int(54321))  #None
print(next_int(28543211))   #31122458
print(next_int(4068929357253497956390133846146756840221))   #4068929357253497956390133846146756841022

点评

3.164s,10万位数据测试,结果正确  发表于 2017-12-11 10:58

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-7 09:24:59 | 显示全部楼层
单数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-7 10:04:36 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-12-7 17:05 编辑
def next_int(m):
    list1 = list(str(m))
    i = len(list1) - 1
    while i != 0 and list1[i] <= list1[i - 1]:
        i -= 1
    if i == 0:
        return 'None'
    w=min([list1[x] for x in range(i, len(list1)) if list1[x] > list1[i - 1]])
    ans = str(m)[:i - 1] + w
    list1=list1[i-1:]
    list1.remove(w)
    list1.sort()
    for t in list1:
        ans+=t
    return int(ans)

点评

0.461s,10万位数据测试,结果正确  发表于 2017-12-11 10:58

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-7 16:15:04 | 显示全部楼层
def next_int(m):
    size=len(m)
    a=list(m)
    i=size-2
    while i>=0 and a[i]>=a[i+1]:
        i-=1
    if i<0:
        return False
    j=size-1
    while a[j]<=a[i]:
        j-=1
    t=a[i]
    a[i]=a[j]
    a[j]=t
    b=a[i+1:size]
    b.reverse()
    a[i+1:size]=b
    m=''.join(a)
    return m

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励,输入的是数字哦,不是字符串

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-7 18:47:27 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-12-7 20:47 编辑
def next_int(m):
    a=list(str(m))
    size=len(a)
    i=size-2
    while i>=0 and a[i]>=a[i+1]:
        i-=1
    if i<0:
        return False
    j=size-1
    while a[j]<=a[i]:
        j-=1
    t=a[i]
    a[i]=a[j]
    a[j]=t
    b=a[i+1:size]
    b.reverse()
    a[i+1:size]=b
    m=int(''.join(a))
    return m

点评

0.265s,10万位数据测试,结果正确  发表于 2017-12-11 11:00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-8 10:50:52 | 显示全部楼层
本帖最后由 大月饼 于 2017-12-8 11:13 编辑
def next_int(m):
    flag = 0
    nums = list(str(m))
    for i in range(len(nums)-2,-1,-1):
        if nums[i]<nums[i+1]:
            flag = 1
            temp = nums[i:]
            for j in range(len(temp)-1,-0,-1):
                if temp[0] < temp[j]:
                    t=temp[0]
                    temp[0] = temp[j]
                    temp[j]=t[:]
                    break
            temp[1:] = sorted(temp[1:])
            nums=nums[:i]+temp
            break
    if flag == 0:
        return None
    else:
        temp=''
        for i in range(len(nums)):
            temp=temp+nums[i]
        n=int(temp)
    return n

点评

0.281s,10万位数据测试,结果正确  发表于 2017-12-11 11:00

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-8 12:08:26 | 显示全部楼层
本帖最后由 cngoodboy 于 2017-12-8 12:18 编辑
def next_int(m):
    m = list(str(m))
    l = len(m)
    for i in range(l-1, 0, -1):
        if m[i] > m[i-1]:
            break
    else:
        return None
    mid = i
    for j in range(l-1, i-1, -1):
        if m[i-1] < m[j] <= m[i]:
            if m[mid] > m[j]:
                mid = j
    m[i-1], m[mid] = m[mid], m[i-1]
    m[i:] = sorted(m[i:])
    s = ''.join(m)
    return int(s)
利用字符串
在我的机子上一次计算大概3微秒,弱机可能5微秒

点评

0.250s,10万位数据测试,结果正确  发表于 2017-12-11 11:02

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-8 12:27:40 | 显示全部楼层
本帖最后由 gunjang 于 2017-12-10 09:59 编辑
#http://bbs.fishc.com/thread-100954-1-1.html
def next_int(m):
        m = str(m)
        if len(m)==1: #one digit
                return None
        for i in range(len(m)-2, -1, -1):
                if m[i] < m[i+1]: break
        if (i==0) and (m[0] >= m[1]): #max number
                return None

        for j in range(len(m)-1, i, -1):
                if m[j] > m[i]: break

        return int(m[:i]+m[j]+m[len(m)-1:j:-1]+m[i]+m[j-1:i:-1])

#输入m = 28543211,输出n = 31122458
print(28543211, next_int(28543211))
#24531 25134
print(24531, next_int(24531))
print(54321, next_int(54321))
print(next_int(3))
print(4054321, next_int(4054321))        

点评

0.250s,10万位数据测试,答案正确  发表于 2017-12-11 11:04

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-8 17:11:42 | 显示全部楼层
def next_int(m):
    t = list(str(m))
    if t == sorted(t,reverse=True):
        return None
    len1 = len(t)
    for i in range(len1-1,0,-1):
        if t[i] > t[i-1]:            
            t[i-1],t[i] =  t[i],t[i-1]
            temp = t[i+1:]
            temp.sort()
            len2 = len(temp)
            for j in range(len2):
                if t[i] < temp[j]:
                    temp.insert(j,t[i])
                    break
            else:
                temp.append(t[i])
            t = t[:i] + temp
            break
    n=''
    for each in t:
        n += each
    return int(n)

print(next_int(7651342491577772))

点评

0.265s,10万位数据测试,答案正确  发表于 2017-12-11 11:05

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-9 16:21:12 | 显示全部楼层
def next_int(m):
    list1 = [int(each) for each in str(m)]
    length = len(list1)
    for i in range(length-2,-1,-1):
        if list1[i] < list1[i+1]:
            n_change = i
            for j in range(length-1,i,-1):
                if list1[j] > list1[i]:
                    list1[j],list1[i] = list1[i],list1[j]
                    break
            break
    else:
        return None
    change = list1[i+1:]
    change.reverse()
    list2 =list1[:n_change+1] + change
    answer = ''
    for each in list2:
        answer += str(each)
    return int(answer)

点评

0.328s,10万位数据测试,答案正确  发表于 2017-12-11 11:06

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-9 18:08:30 | 显示全部楼层
def next_int(m):
    strinputlist = list(str(m))
    tmplist = []
    tmplist.append(strinputlist.pop())
    j = 0
    strmin = 0
    while strmin == 0 and len(strinputlist) != 0:
        tmpstr = strinputlist.pop()
        tmplist.append(tmpstr)
        if tmpstr >= max(tmplist):
            pass
        else:
            i = 0
            tmpmaxlist = []
            while i < len(tmplist):
                if tmpstr < tmplist[i]:
                    tmpmaxlist.append(tmplist[i])
                i += 1
            strmin = min(tmpmaxlist)
    if strmin == 0:
        n=None
    else:
        tmplist.remove(strmin)
        tmplist.sort()
        strinputlist.append(strmin)
        strinputlist.extend(tmplist)
        n=int(''.join(strinputlist))
    return n

print(next_int(54321))
print(next_int(28543211))
print(next_int(24531))
---------------结果------------------
None
31122458
25134

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励,10万位数据测试,时间过长

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-9 20:11:34 | 显示全部楼层
666,DDDDDDDDDDDDDDD
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-9 22:01:13 | 显示全部楼层
def next_int(m):
    l,t=list(str(m)),-1
    for i in range(len(l)-1,0,-1):
        if l[i]>l[i-1]:
            t=i-1
            break
    if t==-1:
        n=None
    else:
        for i in range(len(l)-1,0,-1):
            if l[t]<l[i]:
                l[t],l[i]=l[i],l[t]
                n=int(''.join(l[:t+1])+''.join(sorted(l[t+1:])))
                break
    return n

点评

0.250s,10万位数据测试,答案正确  发表于 2017-12-11 11:09

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-10 00:59:54 | 显示全部楼层

def next_int(m):
    '''your code here'''

    a = str(m)
    s = len(a)
    b = int(a)
    try:
        for x in range(2,s+1):
            for c in range(1,x):
                if a[-x] < a[-c]:
                    raise ValueError
                    
    except ValueError:
        e = list(a[0:s-x])
        e.append(a[-c])
        f = list(a[s-x:s-c])+list(a[s-c+1:])
        for i in range(len(f)-1):
            for j in range(len(f) - i -1):
                if f[j] > f[j+1]:
                    f[j], f[j+1] = f[j+1], f[j]
        g = (e+f)
        n = 0
        for h in range(0,s):

            n = n+int(g[h])*10**(s-h-1)
            

    else:
        n = None
    return n

        
            

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励,10万位数据测试,时间过长

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-10 07:45:30 | 显示全部楼层
双数 + 1!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-10 09:37:06 | 显示全部楼层
本帖最后由 拓离 于 2017-12-10 09:38 编辑
def next_int(m):
    m = str(m)
    i1 = 0
    i2 = 0
    for i in range(len(m)-1, -1, -1):
        for j in range(i, len(m)):
            if int(m[j]) > int(m[i]):
                i1 = j
                i2 = i
        if i1!=i2:break    
    if i1 == i2:
        return None

    m1 = m[i1+1:][::-1]
    m2 = m[i2+1:i1][::-1]
    n = m[:i2]+m[i1]+m1+m[i2]+m2
    return n

if __name__ == "__main__":
    next_int(m)

            

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励,10万位数据测试,时间过长

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-10 14:26:32 | 显示全部楼层
我刚入门,我猜1,单数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-10 16:54:50 | 显示全部楼层
#python 3.4
#主要使用数组排序
def next_int(m):
    n = 0
    n_str = ''
    change_Str = str(m)   #转换成字符串
    d = []                #用来存放转换数组
    n_list = []           #最后答案数组
    for x in range (len(change_Str)):   #获得与m序列相同的数组
        d.append(change_Str[x])
    d.reverse ()          #为从后往前判断将数组改为倒序
    for x in range (len(d)-1):          
        
        if(d[x]>d[x+1]):                #两两比大小若发现原数组后一位大于前一位
                                        #将前一位连同所有后置位所有数取出,选出
            g=''  #存放选出数字         #比之前前一位大并且最小的一位数
            e = d[0:x+2] #抽取自数列    #后按照原数组前面不变将选出得数插在后面
            e.sort()                    #最后把后面的数从小到大排列插在最后
            index = e.index(d[x+1])+1   #完成 ^V^
            f = index                   #f存放比前一位大最小的数字
            for x in range(len(e)):     #这里处理子数列有重复数字情况
                if (x<len(e) and e[f]==e[f-1]):
                    f+=1
                elif (x==len(e)):
                    pass
                    
                else:
                    break
            g=e[f]                      #存放选出数字
            e.remove(e[f])
            e.reverse()
            for  x in range (len(e)):   
                
                n_list.append(e[x])
            n_list.append(g)
            for x in d[x+2:]:
                n_list.append(x)
            break

        else:
            continue
    if(len(n_list)==0):
        return None
            

    n_list.reverse()
    for x in n_list:
        n_str += x
    n = int(n_str)
    
    return n

点评

0.281s,10万位数据测试,答案正确  发表于 2017-12-11 11:13

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 14:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表