淘宝面试题猜数字游戏

来源:互联网 发布:淘宝网拍卖车辆提档 编辑:程序博客网 时间:2024/04/30 09:10
开源中国

代码分享

当前位置:
代码分享 » Python  » 编程基础
yangst

淘宝面试题猜数字游戏

yangst 发布于 2012年08月21日 14时,17评/2055阅
分享到 
收藏+7
踩顶0
CNT 看到一个帖子分享的淘宝的一道笔试题,猜数字的问题,1-100随机取一个数, 如果猜的数小了,系统提示你猜小了,如果猜大了,系统只会提示你猜错了,并且以后也不会提示你猜小了或猜大了,问能不能以最少的次数猜对,并且次数是多少,还有第一次应该猜几。刚开始学python,就简单把游戏过程写了一下。。。。纯菜鸟。。。。。。。。就当练手了
传完才发现我已经把次数限制在14了。。。不知道有没其他答案。
标签: <无>

代码片段(1)[全屏查看所有代码]

1. [文件] guess.py ~ 485B     下载(19)    

01#!/usr/bin/env python
02 
03#guess a number between 1-100
04#if it is smaller ,tell you smaller
05#if it is bigger,just tell you are wrong
06 
07from random import randint
08 
09num =randint(1,100)
10print num
11flag =True
12count =14
13while count>0:
14    count-=1;
15    number = int(raw_input('input the number:'))
16    ifnumber ==num:
17        print'good!!'
18        break
19    else:
20        ifnumber<num and flag:
21            print'smaller,please pick a bigger one'
22        else:
23            print'wrong'
24            ifflag:
25                flag= False
26else:
27    print'you lose'
举报


开源中国-程序员在线工具:API文档大全(120+)JS在线编辑演示 二维码 更多»

发表评论回到顶部网友评论(17)

  • 1楼:飞晏 发表于 2012-08-21 15:58 回复此评论
    我也是刚学了2天python,不过我觉得这个题目和语言貌似无关。考察的是二分算法吧,第一个数字肯定输入50了,我就顺着楼主的代码copy一份,很多基础我还不明白。
    01#!/usr/bin/env python
    02 
    03#guess a number between 1-100
    04#if it is smaller ,tell you smaller
    05#if it is bigger,just tell you are wrong
    06 
    07from random import randint
    08 
    09num =randint(1,100)
    10count =0
    11 
    12while 2>1:
    13    count += 1
    14    number = int(raw_input('input the number:'))
    15    ifnumber ==num:
    16        print'good!'
    17        print'\n'
    18        printcount
    19        print'times'
    20        break
    21    else:
    22        ifnumber<num and flag:
    23            print'smaller'
    24        else:
    25            print'bigger'

    测试:
    1feiyan<a href="http://my.oschina.net/u/575662"target="_blank" rel="nofollow">@FPC</a> :$ python guess.py
    2input the number:50
    3bigger
    4input the number:25
    5smaller
    6input the number:37
    7good!
    83
    9times


  • 2楼:李师叔 发表于 2012-08-21 16:05 回复此评论
    猜大了就输了,猜小了可以继续?那这就不是二分算法了啊
  • 3楼:yangst 发表于 2012-08-21 20:23 回复此评论

    引用来自“飞晏”的评论

    我也是刚学了2天python,不过我觉得这个题目和语言貌似无关。考察的是二分算法吧,第一个数字肯定输入50了,我就顺着楼主的代码copy一份,很多基础我还不明白。
    01#!/usr/bin/env python
    02 
    03#guess a number between 1-100
    04#if it is smaller ,tell you smaller
    05#if it is bigger,just tell you are wrong
    06 
    07from random import randint
    08 
    09num =randint(1,100)
    10count =0
    11 
    12while 2>1:
    13    count += 1
    14    number = int(raw_input('input the number:'))
    15    ifnumber ==num:
    16        print'good!'
    17        print'\n'
    18        printcount
    19        print'times'
    20        break
    21    else:
    22        ifnumber<num and flag:
    23            print'smaller'
    24        else:
    25            print'bigger'

    测试:
    1feiyan<a href="http://my.oschina.net/u/575662"target="_blank" rel="nofollow">@FPC</a> :$ python guess.py
    2input the number:50
    3bigger
    4input the number:25
    5smaller
    6input the number:37
    7good!
    83
    9times


    不是这样的,如果有一次猜大了,程序就不会提示你是猜大了还是猜小了,只告诉你是猜对了还是猜错了,并且这次以后不论猜大了猜小了都只提示猜错了。。。
  • 4楼:yangst 发表于 2012-08-21 20:26 回复此评论

    引用来自“水月沧澜”的评论

    猜大了就输了,猜小了可以继续?那这就不是二分算法了啊
    看一下三楼。。可能有些地方没说明白
  • 5楼:sybn 发表于 2012-08-21 20:28 回复此评论
    从11开始,每次加10
    也就是11,21,31,41...91,93,95,97,99,100
    14次
  • 6楼:sybn 发表于 2012-08-21 20:30 回复此评论
    11,21,31,41...91,94,97,99,100
    11,21,31,41...91,94,97,99,98
    11,21,31,41...91,94,97,95,96
    这样是13次
  • 7楼:sybn 发表于 2012-08-21 20:32 回复此评论
    还可以继续优化,谁顶上继续,步进应该持续减小.我都用的10,是偷懒的办法
  • 8楼:yangst 发表于 2012-08-21 20:38 回复此评论

    引用来自“sybn”的评论

    还可以继续优化,谁顶上继续,步进应该持续减小.我都用的10,是偷懒的办法
    我用的持续减小的步进 9 22 34 45 55 64 72 79 85 90 94 97 99 100 是14步
  • 9楼:清流 发表于 2012-08-23 21:07 回复此评论

    引用来自“sybn”的评论

    11,21,31,41...91,94,97,99,100
    11,21,31,41...91,94,97,99,98
    11,21,31,41...91,94,97,95,96
    这样是13次
    若在51错了,便要14次了额
  • 10楼:清流 发表于 2012-08-23 21:11 回复此评论

    引用来自“yangst”的评论

    引用来自“sybn”的评论

    还可以继续优化,谁顶上继续,步进应该持续减小.我都用的10,是偷懒的办法
    我用的持续减小的步进 9 22 34 45 55 64 72 79 85 90 94 97 99 100 是14步
    楼主的思考的很到位,是从100开始倒着看的,那么按14次来,从14开始也行,于是第一个数可以猜9-14均可,只要后面把握好就行
  • 11楼:sybn 发表于 2012-08-24 14:05 回复此评论
    那天下班回去的路上想了一下,在数学上这道题简化后就是:1+2+3+4...+n>100 求你的最小值.
    于是n=14
  • 12楼:yodfz 发表于 2012-08-28 09:08 回复此评论
    貌似二分?
  • 13楼:MeMe 发表于 2012-08-28 16:16 回复此评论
    如果每个数最多要猜14次的话,步进递减,以下面的数列达到最小值
    13,26,38,49,59,68,76,83,89,94,98
    平均猜9.46次可以命中一个数

    如果每个数不限长的猜的话,暂时不知道是否有最优解,求科普
  • 14楼:winktj 发表于 2012-08-28 19:40 回复此评论

    引用来自“sybn”的评论

    11,21,31,41...91,94,97,99,100
    11,21,31,41...91,94,97,99,98
    11,21,31,41...91,94,97,95,96
    这样是13次
    哎兄弟我有点不太明白啊,如果是这样的话,假设在61提示猜错了。 那么已经猜了6次了,但是还是需要在51-61之间猜一个数,还需要9次,那就是15次了,求解。。。。
  • 15楼:yeliuping 发表于 2012-08-29 14:51 回复此评论
    x为100分为x段
     y=100/x-(100%x==0 and 1 or 0)+x-1 求出x在(0<x<=100)间的y的最小值
    然后以100/x开始100/x递增 如果提示“猜错了” 该数进行以1递减,如果在100/x-(100%x==0 and 1 or 0)次还未提示“猜测了”该数以1递增。计算结果x=10或11(最快第1次就猜对,最晚低19次猜对)
    不知道是不是这么算的 请赐教





  • 16楼:mavarick 发表于 2012-09-07 21:36 回复此评论
    一个递归问题:
    问题可以简化为:

    在(start,end)中间去数k,使得当k取大和取小最终走的步数一样。也就是个等概率问题。所以现在可以考虑:
    如果k取大了,那么需要走k-start -1次
    如果k取小了,那么需要继续在(k+1,end)之间取数。同样的过程

    那么最小的取此集合是多少呢?
    假设 96,97,98,99,100 五个数,怎么取呢
    同样,取2最好,具体不解释。最多需要3次。取最大 3次
    那么上一次取的集合是多少个数值呢?
    应该是 本次的取的集合 + 最大的取次 + 1
    即[92, 93, 94, 95] [,96, 97 ,98 ,99 , 100]
    同理
    可得:
    集合个数 5 9 14 20 27 35 44  54 65 77 90 104
          取次 3 4 5   6   7   8   9   10 11 12 13 14

    可见,去14次就可以取100个数一样

    所以最多14次