jerryxjr1220 发表于 2017-12-6 11:48:49

鱼C论坛Python精英挑战赛(第四季03期)

本帖最后由 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

竞猜:回答正确的参赛者的人数

yjsx86 发表于 2017-12-6 16:30:05

本帖最后由 yjsx86 于 2017-12-6 16:48 编辑

def next_int(m):
    m =
    if m > max(m):
      return None
    temp, i, n, flag = 0, -1, [], True
    while flag:
      for j in range(len(n)):
            if m < n:
                temp = n
                n = m
                n.insert(0,temp)
                n = m[:i] + n
                flag = False
                break
      if flag:
            n.append(m)
            i -= 1
    rs = 0
    for k in range(len(n)):
      rs = rs*10 + n
    return rs

Elastcio 发表于 2017-12-6 21:24:49

def next_int(m):
    m_list = list(map(int,list(str(m))))
    t_list = ]
   

    for index, item in enumerate(reversed(m_list)):
      if index:
            if item >= t_list:
                t_list.insert(0,item)
            else:
                m_list[-index-1] = min(x for x in t_list if x > item)
                t_list = item
                break
      if index == len(m_list)-1: return None
    n = m_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


赵鑫权2353 发表于 2017-12-7 09:24:59

单数

土沙拉 发表于 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 <= list1:
      i -= 1
    if i == 0:
      return 'None'
    w=min( for x in range(i, len(list1)) if list1 > list1])
    ans = str(m)[:i - 1] + w
    list1=list1
    list1.remove(w)
    list1.sort()
    for t in list1:
      ans+=t
    return int(ans)

SylarPu 发表于 2017-12-7 16:15:04

def next_int(m):
    size=len(m)
    a=list(m)
    i=size-2
    while i>=0 and a>=a:
      i-=1
    if i<0:
      return False
    j=size-1
    while a<=a:
      j-=1
    t=a
    a=a
    a=t
    b=a
    b.reverse()
    a=b
    m=''.join(a)
    return m

SylarPu 发表于 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>=a:
      i-=1
    if i<0:
      return False
    j=size-1
    while a<=a:
      j-=1
    t=a
    a=a
    a=t
    b=a
    b.reverse()
    a=b
    m=int(''.join(a))
    return m

大月饼 发表于 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<nums:
            flag = 1
            temp = nums
            for j in range(len(temp)-1,-0,-1):
                if temp < temp:
                  t=temp
                  temp = temp
                  temp=t[:]
                  break
            temp = sorted(temp)
            nums=nums[:i]+temp
            break
    if flag == 0:
      return None
    else:
      temp=''
      for i in range(len(nums)):
            temp=temp+nums
      n=int(temp)
    return n

cngoodboy 发表于 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 > m:
            break
    else:
      return None
    mid = i
    for j in range(l-1, i-1, -1):
      if m < m <= m:
            if m > m:
                mid = j
    m, m = m, m
    m = sorted(m)
    s = ''.join(m)
    return int(s)

利用字符串
在我的机子上一次计算大概3微秒,弱机可能5微秒

gunjang 发表于 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 < m: break
        if (i==0) and (m >= m): #max number
                return None

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

        return int(m[:i]+m+m+m+m)

#输入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))       

BngThea 发表于 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 > t:            
            t,t =t,t
            temp = t
            temp.sort()
            len2 = len(temp)
            for j in range(len2):
                if t < temp:
                  temp.insert(j,t)
                  break
            else:
                temp.append(t)
            t = t[:i] + temp
            break
    n=''
    for each in t:
      n += each
    return int(n)

print(next_int(7651342491577772))

蓝色王魂 发表于 2017-12-9 16:21:12

def next_int(m):
    list1 =
    length = len(list1)
    for i in range(length-2,-1,-1):
      if list1 < list1:
            n_change = i
            for j in range(length-1,i,-1):
                if list1 > list1:
                  list1,list1 = list1,list1
                  break
            break
    else:
      return None
    change = list1
    change.reverse()
    list2 =list1[:n_change+1] + change
    answer = ''
    for each in list2:
      answer += str(each)
    return int(answer)

qwc3000 发表于 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:
                  tmpmaxlist.append(tmplist)
                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

5dzz 发表于 2017-12-9 20:11:34

666,DDDDDDDDDDDDDDD

万事屋 发表于 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>l:
            t=i-1
            break
    if t==-1:
      n=None
    else:
      for i in range(len(l)-1,0,-1):
            if l<l:
                l,l=l,l
                n=int(''.join(l[:t+1])+''.join(sorted(l)))
                break
    return n

tuifei 发表于 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)
      e.append(a[-c])
      f = list(a)+list(a)
      for i in range(len(f)-1):
            for j in range(len(f) - i -1):
                if f > f:
                  f, f = f, f
      g = (e+f)
      n = 0
      for h in range(0,s):

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

    else:
      n = None
    return n

      
            

Ruide 发表于 2017-12-10 07:45:30

双数 + 1!

拓离 发表于 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) > int(m):
                i1 = j
                i2 = i
      if i1!=i2:break   
    if i1 == i2:
      return None

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

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


            

fengling1017 发表于 2017-12-10 14:26:32

我刚入门,我猜1,单数

冷笑寒风 发表于 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)
    d.reverse ()          #为从后往前判断将数组改为倒序
    for x in range (len(d)-1):         
      
      if(d>d):                #两两比大小若发现原数组后一位大于前一位
                                        #将前一位连同所有后置位所有数取出,选出
            g=''#存放选出数字         #比之前前一位大并且最小的一位数
            e = d #抽取自数列    #后按照原数组前面不变将选出得数插在后面
            e.sort()                  #最后把后面的数从小到大排列插在最后
            index = e.index(d)+1   #完成 ^V^
            f = index                   #f存放比前一位大最小的数字
            for x in range(len(e)):   #这里处理子数列有重复数字情况
                if (x<len(e) and e==e):
                  f+=1
                elif (x==len(e)):
                  pass
                  
                else:
                  break
            g=e                      #存放选出数字
            e.remove(e)
            e.reverse()
            forx in range (len(e)):   
               
                n_list.append(e)
            n_list.append(g)
            for x in d:
                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
页: [1] 2 3
查看完整版本: 鱼C论坛Python精英挑战赛(第四季03期)