鱼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: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 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
单数 本帖最后由 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) 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
本帖最后由 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 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: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-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)) 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)) 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) 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
666,DDDDDDDDDDDDDDD 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
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
双数 + 1! 本帖最后由 拓离 于 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)
我刚入门,我猜1,单数 #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