免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2894 | 回复: 5
打印 上一主题 下一主题

现在有一万(1-10000)的个数,假如拿掉的是两个数,怎么才能找出拿掉的数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-11 09:28 |只看该作者 |倒序浏览
:wink:

论坛徽章:
0
2 [报告]
发表于 2009-07-11 14:45 |只看该作者
试着回一贴。

#!/usr/bin/env python
#coding=utf-8

import time

"""全局变量"""
numList = []
maxnum = 0
headtag = 0
tailtag = 0
midtag = 0


def SearchNum(missingnum):
    """递归折半查找
    "
""
    global headtag
    global tailtag
    global midtag
    
    #print headtag,midtag,tailtag
&nbsp;&nbsp;&nbsp;&nbsp;if tailtag - headtag < 3:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if numList[headtag] != headtag + 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;missingnum.append(headtag + 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midtag = headtag
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif numList[midtag] != midtag + 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;missingnum.append(midtag + 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;missingnum.append(tailtag + 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midtag = tailtag
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0

&nbsp;&nbsp;&nbsp;&nbsp;if numList[midtag] == midtag + 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headtag = midtag
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midtag = int((headtag + tailtag) / 2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SearchNum(missingnum)
&nbsp;&nbsp;&nbsp;&nbsp;elif numList[midtag] > midtag + 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tailtag = midtag
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midtag = int((headtag + tailtag) / 2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SearchNum(missingnum)

&nbsp;&nbsp;&nbsp;&nbsp;
def SetNumList():
&nbsp;&nbsp;&nbsp;&nbsp;"""初始化数据
&nbsp;&nbsp;&nbsp;&nbsp;"
""
&nbsp;&nbsp;&nbsp;&nbsp;global numList
&nbsp;&nbsp;&nbsp;&nbsp;global maxnum
&nbsp;&nbsp;&nbsp;&nbsp;global headtag
&nbsp;&nbsp;&nbsp;&nbsp;global tailtag
&nbsp;&nbsp;&nbsp;&nbsp;global midtag   
&nbsp;&nbsp;&nbsp;&nbsp;numList = range(1,1000001)
&nbsp;&nbsp;&nbsp;&nbsp;maxnum = len(numList)
&nbsp;&nbsp;&nbsp;&nbsp;numList.remove(3434)
&nbsp;&nbsp;&nbsp;&nbsp;numList.remove(607068)
&nbsp;&nbsp;&nbsp;&nbsp;headtag = 0
&nbsp;&nbsp;&nbsp;&nbsp;tailtag = len(numList) - 1
&nbsp;&nbsp;&nbsp;&nbsp;midtag = int(tailtag / 2)


def InsertNumList(position,num):
&nbsp;&nbsp;&nbsp;&nbsp;"""插入缺失数
&nbsp;&nbsp;&nbsp;&nbsp;"
""
&nbsp;&nbsp;&nbsp;&nbsp;global numList
&nbsp;&nbsp;&nbsp;&nbsp;numList.insert(position,num)

&nbsp;&nbsp;&nbsp;&nbsp;
def ResetGlobalParam():
&nbsp;&nbsp;&nbsp;&nbsp;"""重置标志位
&nbsp;&nbsp;&nbsp;&nbsp;"
""
&nbsp;&nbsp;&nbsp;&nbsp;global headtag
&nbsp;&nbsp;&nbsp;&nbsp;global tailtag
&nbsp;&nbsp;&nbsp;&nbsp;global midtag
&nbsp;&nbsp;&nbsp;&nbsp;headtag = 0
&nbsp;&nbsp;&nbsp;&nbsp;tailtag = maxnum - 1
&nbsp;&nbsp;&nbsp;&nbsp;midtag = int(tailtag / 2)


if __name__ == "__main__":
&nbsp;&nbsp;&nbsp;&nbsp;print "Method 1"
&nbsp;&nbsp;&nbsp;&nbsp;SetNumList()
&nbsp;&nbsp;&nbsp;&nbsp;beginTime = time.time()
&nbsp;&nbsp;&nbsp;&nbsp;missingnum = []
&nbsp;&nbsp;&nbsp;&nbsp;SearchNum(missingnum)
&nbsp;&nbsp;&nbsp;&nbsp;#print missingnum
&nbsp;&nbsp;&nbsp;&nbsp;#print midtag
&nbsp;&nbsp;&nbsp;&nbsp;InsertNumList(midtag,missingnum[0])
&nbsp;&nbsp;&nbsp;&nbsp;ResetGlobalParam()
&nbsp;&nbsp;&nbsp;&nbsp;SearchNum(missingnum)
&nbsp;&nbsp;&nbsp;&nbsp;print missingnum
&nbsp;&nbsp;&nbsp;&nbsp;#print midtag
&nbsp;&nbsp;&nbsp;&nbsp;endTime = time.time()
&nbsp;&nbsp;&nbsp;&nbsp;print endTime - beginTime

论坛徽章:
0
3 [报告]
发表于 2009-07-11 21:07 |只看该作者
假设这两个数是A和B
用xor求出 A^B
用加减法求出 A+B
然后呢...
二元一次方程...

论坛徽章:
0
4 [报告]
发表于 2009-07-20 20:48 |只看该作者
2楼的代码是对于排好序的列表。
楼主,这数据是不是排好序的,问题都不详细。

论坛徽章:
0
5 [报告]
发表于 2009-07-21 10:04 |只看该作者

对于1-10000这样的数据量,集合是最快的,而且无需排序

#产生拿掉两个数的数列L0
l0=list(range(1,10001))
x1=int(input("1'st Num:"))
x2=int(input("2'st Num:"))
l0.remove(x1)
l0.remove(x2)

#-------------BEGIN---------------
#产生完整的1-10000的数列L1
l1=list(range(1,10001))
#将L0从L1中拿掉
l2=list(set(l1)-set(l0))
#余下的就是你拿走的
print('You have:', l2)
#--------------END----------------


[ 本帖最后由 cnsunus 于 2009-7-21 11:33 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2009-07-21 10:31 |只看该作者

  1. cuisw@shaowei:~/codes$ cat find_num.py
  2. #!/usr/bin/python
  3. # -*- coding: utf-8 -*-

  4. num_list = range(0, 1000000)

  5. num_list.remove(4567)
  6. num_list.remove(90)

  7. cmp_list = [0 for i in range(0, 1000000)]
  8. for i in num_list:
  9.   cmp_list[i] = 1

  10. print [i for i in range(0, 1000000) if cmp_list[i] == 0]
  11. cuisw@shaowei:~/codes$ time python find_num.py
  12. [90, 4567]

  13. real        0m0.823s
  14. user        0m0.696s
  15. sys        0m0.080s
  16. cuisw@shaowei:~/codes$

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP