关于sina api上传图片接口(upload) c#版

    之前我写了sinaapi c#的sdk:opensinaapi,没有实现上传图片的接口。因为要忙实验室和其他项目,一直没有去研究。期间很多人询问过我有关上传图片接口的问题,最近刚好有些时间,花了一个晚上实现出来,需要的同学可以去http://code.google.com/p/opensinaapi/downloads/list下载。

    在研究的过程中我发现相关的资料非常少,基本上不能找到有用的信息。相对来说,twitter api的upload借口实现有其借鉴意义,但是其并不适用在sina api上,如果有人去研究的话应该会发现大多会返回401错误(未能授权)。原因是:sina api和twitter api中post的参数不一样,sina api中多了一个参数:source,少了oauth_verify。POST的参数和Update的接口一样,需要将status加入签名。

    我在研究过程中主要是抓取upload的POST包,对包结构进行分析,从而用c#构造POST包(抓包工具HttpAnalyzer)。以下为一个真实的POST包:

 

POST /statuses/upload.json HTTP/1.1
Authorization: OAuth oauth_consumer_key="3587646579", oauth_signature_method="HMAC-SHA1",oauth_timestamp="1289113593", oauth_nonce="7472747", oauth_version="1.0", oauth_token="9f273ceccf51e528b302a3a47053badd",oauth_signature="O5b4XTaazF6T50YqSsyLM6RtRsk%3d"
User-Agent: Jakarta Commons-HttpClient/3.1
Content-Type: multipart/form-data; boundary=bb9f588b-0eaf-4d95-aaec-b10f057bccd7
Host: api.t.sina.com.cn
Content-Length: 26509

--bb9f588b-0eaf-4d95-aaec-b10f057bccd7
Content-Disposition: form-data; name="status"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit

%e6%88%91%e6%98%af%e9%99%88%e7%9d%80
--bb9f588b-0eaf-4d95-aaec-b10f057bccd7
Content-Disposition: form-data; name="source"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit

3587646579
--bb9f588b-0eaf-4d95-aaec-b10f057bccd7
Content-Disposition: form-data; name="pic"; filename="sample_image.png"
Content-Type: application/octet-stream; charset=UTF-8
Content-Transfer-Encoding: binary
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
--bb9f588b-0eaf-4d95-aaec-b10f057bccd7


XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX为二进制文件串

以下是构造POST包的c#代码

 

public string oAuthWebRequestWithPic(Method method, string url, string postData,string filepath,string picName)
        {
            var UploadApiUrl = url;
            string status = postData.Split('=').GetValue(1).ToString();
            postData += "&source=" + _consumerKey;//多了一个source参数

            if (postData.Length > 0)
            {
                NameValueCollection qs = HttpUtility.ParseQueryString(postData);
                postData = "";
                foreach (string key in qs.AllKeys)
                {
                    if (postData.Length > 0)
                    {
                        postData += "&";
                    }
                    qs[key] = HttpUtility.UrlEncode(qs[key]);
                    qs[key] = this.UrlEncode(qs[key]);
                    postData += (key + "=" + qs[key]);

                }
                if (url.IndexOf("?") > 0)
                {
                    url += "&";
                }
                else
                {
                    url += "?";
                }
                url += postData;
            }

            var oauthSignaturePattern = "OAuth oauth_consumer_key=\"{0}\", oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"{1}\", oauth_nonce=\"{2}\", oauth_version=\"1.0\", oauth_token=\"{3}\",oauth_signature=\"{4}\"";
            
            var contentEncoding = "iso-8859-1";

            string normalizedString, normalizedParameters;
            var timestamp = this.GenerateTimeStamp();
            var nounce = this.GenerateNonce();

            var signature = this.GenerateSignature(
                                new Uri(url),
                                this.ConsumerKey,
                                this.ConsumerSecret,
                                this.Token,
                                this.TokenSecret,
                                method.ToString(),
                                timestamp,
                                nounce,
                                out normalizedString,
                                out normalizedParameters);
            signature = HttpUtility.UrlEncode(signature);

            var boundary = Guid.NewGuid().ToString();
            var request = (HttpWebRequest)System.Net.WebRequest.Create(UploadApiUrl);

            request.PreAuthenticate = true;
            request.AllowWriteStreamBuffering = true;
            request.Method = method.ToString();
            request.UserAgent = "Jakarta Commons-HttpClient/3.1";
            var authorizationHeader = string.Format(
                                        CultureInfo.InvariantCulture,
                                        oauthSignaturePattern,
                                        this.ConsumerKey,
                                        timestamp,
                                        nounce,
                                        this.Token,
                                        signature);
            request.Headers.Add("Authorization", authorizationHeader);

            var header = string.Format("--{0}", boundary);
            var footer = string.Format("--{0}--", boundary);

            var contents = new StringBuilder();
            request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
            contents.AppendLine(header);
            contents.AppendLine(String.Format("Content-Disposition: form-data; name=\"{0}\"", "status"));
            contents.AppendLine("Content-Type: text/plain; charset=US-ASCII");
            contents.AppendLine("Content-Transfer-Encoding: 8bit");
            contents.AppendLine();
            contents.AppendLine(status);

            contents.AppendLine(header);
            contents.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", "source"));
            contents.AppendLine("Content-Type: text/plain; charset=US-ASCII");
            contents.AppendLine("Content-Transfer-Encoding: 8bit");
            contents.AppendLine();
            contents.AppendLine(this.ConsumerKey);


            contents.AppendLine(header);
            string fileHeader = string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"", "pic", picName);
            string fileData = System.Text.Encoding.GetEncoding(contentEncoding).GetString(File.ReadAllBytes(@filepath));

            contents.AppendLine(fileHeader);
            contents.AppendLine("Content-Type: application/octet-stream; charset=UTF-8");
            contents.AppendLine("Content-Transfer-Encoding: binary");
            contents.AppendLine();
            contents.AppendLine(fileData);
            contents.AppendLine(footer);

            byte[] bytes = Encoding.GetEncoding(contentEncoding).GetBytes(contents.ToString());
            request.ContentLength = bytes.Length;
            
            var requestStream = request.GetRequestStream();           
            try
            {
                requestStream.Write(bytes, 0, bytes.Length);
            }
            catch
            {
                throw;
            }
            finally
            {
                requestStream.Close();
                requestStream = null;
            }
            return WebResponseGet(request);
        }

其次,需要修改oAuthBase.cs,这是因为签名参数的问题:多了source少了oauth_verify

 

将
public string GenerateSignatureBase(Uri url, string consumerKey, string token, string tokenSecret, string httpMethod, string timeStamp, string nonce, string signatureType, out string normalizedUrl, out string normalizedRequestParameters)中

if (!string.IsNullOrEmpty(oauth_verifier))
改为
if (!string.IsNullOrEmpty(oauth_verifier) && httpMethod == "GET")

有个比较奇怪的问题,sina api的update接口可以不需要将oauth_verify换为source,而upload接口则必须将oauth_verify换为source。

最后,本版本的sdk中,upload的status必须为英文,暂时还没解决中文问题。

注:由于本人时间有限,而sdk还相当不完善,如有同学想加入opensinaapi,请联系sarlmolapple@gmail.com,不胜荣幸,希望能帮助更多的人。

Posted by 陈着 Nov 07, 2010 10:26:13 PM


75道逻辑题

 

   【1】假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。

    由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有1升水,因此6只能向5倒4升水,然后将6剩余的2升,倒入空的5里面,再灌满6向5里倒3升,剩余3升。

   

    【2】周雯的妈妈是豫林水泥厂的化验员。一天,周雯来到化验室做作业。做完后想出去玩。"等等,妈妈还要考你一个题目,"她接着说,"你看这6只做化验用的玻璃杯,前面3只盛满了水,后面3只是空的。你能只移动1只玻璃杯,就便盛满水的杯子和空杯子间隔起来吗?"爱动脑筋的周雯,是学校里有名的"小机灵",她只想了一会儿就做到了。请你想想看,"小机灵"是怎样做的?

    设杯子编号为ABCDEF,ABC为满,DEF为空,把B中的水倒进E中即可。

   

    【3】三个小伙子同时爱上了一个姑娘,为了决定他们谁能娶这个姑娘,他们决定用手枪进行一次决斗。小李的命中率是30%,小黄比他好些,命中率是50%,最出色的枪手是小林,他从不失误,命中率是100%。由于这个显而易见的事实,为公平起见,他们决定按这样的顺序:小李先开枪,小黄第二,小林最后。然后这样循环,直到他们只剩下一个人。那么这三个人中谁活下来的机会最大呢?他们都应该采取什么样的策略?

    小林在轮到自己且小黄没死的条件下必杀黄,再跟菜鸟李单挑。所以黄在林没死的情况下必打林,否则自己必死。小李经过计算比较(过程略),会决定自己先打小林。于是经计算,小李有873/2600≈33.6%的生机;小黄有109/260≈41.9%的生机;小林有24.5%的生机。哦,这样,那小李的第一枪会朝天开,以后当然是打敌人,谁活着打谁;小黄一如既往先打林,小林还是先干掉黄,冤家路窄啊!最后李,黄,林存活率约38:27:35;菜鸟活下来抱得美人归的几率大。李先放一空枪(如果合伙干中林,自己最吃亏)黄会选林打一枪(如不打林,自己肯定先玩完了)林会选黄打一枪(毕竟它命中率高)李黄对决0.3:0.280.4可能性李林对决0.3:0.60.6可能性成功率0.73;李和黄打林李黄对决0.3:0.40.7*0.4可能性李林对决0.3:0.7*0.6*0.70.7*0.6可能性成功率0.64。


    【4】一间囚房里关押着两个犯人。每天监狱都会为这间囚房提供一罐汤,让这两个犯人自己来分。起初,这两个人经常会发生争执,因为他们总是有人认为对方的汤比自己的多。后来他们找到了一个两全其美的办法:一个人分汤,让另一个人先选。于是争端就这么解决了。可是,现在这间囚房里又加进来一个新犯人,现在是三个人来分汤。必须寻找一个新的方法来维持他们之间的和平。该怎么办呢?按:心理问题,不是逻辑问题

    是让甲分汤,分好后由乙和丙按任意顺序给自己挑汤,剩余一碗留给甲。这样乙和丙两人的总和肯定是他们两人可拿到的最大。然后将他们两人的汤混合之后再按两人的方法再次分汤。

   

    【5】在一张长方形的桌面上放了n个一样大小的圆形硬币。这些硬币中可能有一些不完全在桌面内,也可能有一些彼此重叠;当再多放一个硬币而它的圆心在桌面内时,新放的硬币便必定与原先某些硬币重叠。请证明整个桌面可以用4n个硬币完全覆盖。

    要想让新放的硬币不与原先的硬币重叠,两个硬币的圆心距必须大于直径。也就是说,对于桌面上任意一点,到最近的圆心的距离都小于2,所以,整个桌面可以用n个半径为2的硬币覆盖。把桌面和硬币的尺度都缩小一倍,那么,长、宽各是原桌面一半的小桌面,就可以用n个半径为1的硬币覆盖。那么,把原来的桌子分割成相等的4块小桌子,那么每块小桌子都可以用n个半径为1的硬币覆盖,因此,整个桌面就可以用4n个半径为1的硬币覆盖。

    【6】一个球、一把长度大约是球的直径2/3长度的直尺。你怎样测出球的半径?

    

    【7】五个大小相同的一元人民币硬币。要求两两相接触,应该怎么摆?

 

    底下放一个1,然后2 3放在1上面,另外的4 5竖起来放在1的上面。

    

    【8猜牌问题S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4黑桃J、8、4、2、7、3草花K、Q、5、4、6方块A、5。约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉P先生,把这张牌的花色告诉Q先生。这时,约翰教授问P先生和Q先生:你们能从已知的点数或花色中推知这张牌是什么牌吗?于是,S先生听到如下的对话:P先生:我不知道这张牌。Q先生:我知道你不知道这张牌。P先生:现在我知道这张牌了。Q先生:我也知道了。听罢以上的对话,S先生想了一想之后,就正确地推出这张牌是什么牌。请问:这张牌是什么牌?

    方块5

    【9】一个教授逻辑学的教授,有三个学生,而且三个学生均非常聪明!一天教授给他们出了一个题,教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个!(每个人可以看见另两个数,但看不见自己的)教授问第一个学生:你能猜出自己的数吗?回答:不能,问第二个,不能,第三个,不能,再问第一个,不能,第二个,不能,第三个:我猜出来了,是144!教授很满意的笑了。请问您能猜出另外两个人的数吗?

    经过第一轮,说明任何两个数都是不同的。第二轮,前两个人没有猜出,说明任何一个数都不是其它数的两倍。现在有了以下几个条件:1.每个数大于02.两两不等3.任意一个数不是其他数的两倍。每个数字可能是另两个之和或之差,第三个人能猜出144,必然根据前面三个条件排除了其中的一种可能。假设:是两个数之差,即x-y=144。这时1(x,y>0)和2(x!=y)都满足,所以要否定x+y必然要使3不满足,即x+y=2y,解得x=y,不成立(不然第一轮就可猜出),所以不是两数之差。因此是两数之和,即x+y=144。同理,这时1,2都满足,必然要使3不满足,即x-y=2y,两方程联立,可得x=108,y=36。

    这两轮猜的顺序其实分别为这样:第一轮(一号,二号),第二轮(三号,一号,二号)。这样分大家在每轮结束时获得的信息是相同的(即前面的三个条件)。

    那么就假设我们是C,来看看C是怎么做出来的:C看到的是A的36和B的108,因为条件,两个数的和是第三个,那么自己要么是72要么是144(猜到这个是因为72的话,108就是36和72的和,144的话就是108和36的和。这样子这句话看不懂的举手):

    假设自己(C)是72的话,那么B在第二回合的时候就可以看出来,下面是如果C是72,B的思路:这种情况下,B看到的就是A的36和C的72,那么他就可以猜自己,是36或者是108(猜到这个是因为36的话,36加36等于72,108的话就是36和108的和):

    如果假设自己(B)头上是36,那么,C在第一回合的时候就可以看出来,下面是如果B是36,C的思路:这种情况下,C看到的就是A的36和B的36,那么他就可以猜自己,是72或者是0(这个不再解释了):如果假设自己(C)头上是0,那么,A在第一回合的时候就可以看出来,下面是如果C是0,A的思路:这种情况下,A看到的就是B的36和C的0,那么他就可以猜自己,是36或者是36(这个不再解释了),那他可以一口报出自己头上的36。(然后是逆推逆推逆推),现在A在第一回合没报出自己的36,C(在B的想象中)就可以知道自己头上不是0,如果其他和B的想法一样(指B头上是36),那么C在第一回合就可以报出自己的72。现在C在第一回合没报出自己的36,B(在C的想象中)就可以知道自己头上不是36,如果其他和C的想法一样(指C头上是72),那么B在第二回合就可以报出自己的108。现在B在第二回合没报出自己的108,C就可以知道自己头上不是72,那么C头上的唯一可能就是144了。

 

   【10】某城市发生了一起汽车撞人逃跑事件,该城市只有两种颜色的车,蓝15%绿85%,事发时有一个人在现场看见了,他指证是蓝车,但是根据专家在现场分析,当时那种条件能看正确的可能性是80%那么,肇事的车是蓝车的概率到底是多少?

    15%*80%/(85%×20%+15%*80%)

 

   【11】有一人有240公斤水,他想运往干旱地区赚钱。他每次最多携带60公斤,并且每前进一公里须耗水1公斤(均匀耗水)。假设水的价格在出发地为0,以后,与运输路程成正比,(即在10公里处为10元/公斤,在20公里处为20元/公斤......),又假设他必须安全返回,请问,他最多可赚多少钱?

    f(x)=(60-2x)*x,当x=15时,有最大值450。 450×4

 

   【12】现在共有100匹马跟100块石头,马分3种,大型马;中型马跟小型马。其中一匹大马一次可以驮3块石头,中型马可以驮2块,而小型马2头可以驮一块石头。问需要多少匹大马,中型马跟小型马?(问题的关键是刚好必须是用完100匹马)

    6种结果

 

   【13】1=5,2=15,3=215,4=2145那么5=?

    因为1=5,所以5=1.

 

   【14】有2n个人排队进电影院,票价是50美分。在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子)。愚蠢的电影院开始卖票时1分钱也没有。问:有多少种排队方法使得每当一个拥有1美元买票时,电影院都有50美分找钱

注:1美元=100美分拥有1美元的人,拥有的是纸币,没法破成2个50美分

 

    本题可用递归算法,但时间复杂度为2的n次方,也可以用动态规划法,时间复杂度为n的平方,实现起来相对要简单得多,但最方便的就是直接运用公式:排队的种数=(2n)!/[n!(n+1)!]。

    如果不考虑电影院能否找钱,那么一共有(2n)!/[n!n!]种排队方法(即从2n个人中取出n个人的组合数),对于每一种排队方法,如果他会导致电影院无法找钱,则称为不合格的,这种的排队方法有(2n)!/[(n-1)!(n+1)!](从2n个人中取出n-1个人的组合数)种,所以合格的排队种数就是(2n)!/[n!n!]- (2n)!/[(n-1)!(n+1)!] =(2n)!/[n!(n+1)!]。至于为什么不合格数是(2n)!/[(n-1)!(n+1)!],说起来太复杂,这里就不讲了。

 

   【15】一个人花8块钱买了一只鸡,9块钱卖掉了,然后他觉得不划算,花10块钱又买回来了,11块卖给另外一个人。问他赚了多少?

    2元

 

    【16】有一种体育竞赛共含M个项目,有运动员A,B,C参加,在每一项目中,第一,第二,第三名分别的X,Y,Z分,其中X,Y,Z为正整数且X>Y>Z。最后A得22分,B与C均得9分,B在百米赛中取得第一。求M的值,并问在跳高中谁得第二名。

    因为ABC三人得分共40分,三名得分都为正整数且不等,所以前三名得分最少为6分,40=5*8=4*10=2*20=1*20,不难得出项目数只能是5,即M=5。A得分为22分,共5项,所以每项第一名得分只能是5,故A应得4个一名一个二名.22=5*4+2,第二名得1分,又B百米得第一,所以A只能得这个第二。B的5项共9分,其中百米第一5分,其它4项全是1分,9=5+1=1+1+1,即B除百米第一外全是第三,跳高第二必定是C所得。

    【17】前提:

1 有五栋五种颜色的房子

2 每一位房子的主人国籍都不同

3 这五个人每人只喝一种饮料,只抽一种牌子的香烟,只养一种宠物

4 没有人有相同的宠物,抽相同牌子的香烟,喝相同的饮料

   提示:1  英国人住在红房子里

2  瑞典人养了一条狗

3  丹麦人喝茶

4  绿房子在白房子左边

5  绿房子主人喝咖啡

6  抽PALL MALL烟的人养了一只鸟

7  黄房子主人抽DUNHILL烟

8  住在中间那间房子的人喝牛奶

9  挪威人住第一间房子

10 抽混合烟的人住在养猫人的旁边

11 养马人住在抽DUNHILL烟的人旁边

12 抽BLUE MASTER烟的人喝啤酒

13 德国人抽PRINCE烟

14 挪威人住在蓝房子旁边

15 抽混合烟的人的邻居喝矿泉水

    问题是:谁养鱼???

    第一间是黄房子,挪威人住,喝矿泉水,抽DUNHILL香烟,养猫;第二间是蓝房子,丹麦人住,喝茶,抽混合烟,养马;第三间是红房子,英国人住,喝牛奶,抽PALL MALL烟,养鸟;第四间是绿房子,德国人住,喝咖啡,抽PRINCE烟,养猫、马、鸟、狗以外的宠物;第五间是白房子,瑞典人住,喝啤酒,抽BLUE  MASTER烟,养狗。

 

    【18】5个人来自不同地方,住不同房子,养不同动物,吸不同牌子香烟,喝不同饮料,喜欢不同食物。根据以下线索确定谁是养猫的人。

1 红房子在蓝房子的右边,白房子的左边(不一定紧邻)

2 黄房子的主人来自香港,而且他的房子不在最左边。

3 爱吃比萨的人住在爱喝矿泉水的人的隔壁。

4 来自北京的人爱喝茅台,住在来自上海的人的隔壁。

5 吸希尔顿香烟的人住在养马人的右边隔壁。

6 爱喝啤酒的人也爱吃鸡。

7 绿房子的人养狗。

8 爱吃面条的人住在养蛇人的隔壁。

9 来自天津的人的邻居(紧邻)一个爱吃牛肉,另一个来自成都。

10.养鱼的人住在最右边的房子里。

11.吸万宝路香烟的人住在吸希尔顿香烟的人和吸“555”香烟的人的中间(紧邻)

12.红房子的人爱喝茶。

13.爱喝葡萄酒的人住在爱吃豆腐的人的右边隔壁。

14.吸红塔山香烟的人既不住在吸健牌香烟的人的隔壁,也不与来自上海的人相邻。

15.来自上海的人住在左数第二间房子里。

16.爱喝矿泉水的人住在最中间的房子里。

17.爱吃面条的人也爱喝葡萄酒。

18.吸“555”香烟的人比吸希尔顿香烟的人住的靠右

    第一间是兰房子,住北京人,养马,抽健牌香烟,喝茅台,吃豆腐;第二间是绿房子,住上海人,养狗,抽希尔顿,喝葡萄酒,吃面条;第三间是黄房子,住香港人,养蛇,抽万宝路,喝矿泉水,吃牛肉;第四间是红房子,住天津人,抽555,喝茶,吃比萨;第五间是白房子,住成都人,养鱼,抽红塔山,喝啤酒,吃鸡。

 

    【19】斗地主附残局

地主手中牌2、K、Q、J、10、9、8、8、6、6、5、5、3、3、3、3、7、7、7、7

长工甲手中牌大王、小王、2、A、K、Q、J、10、Q、J、10、9、8、5、5、4、4

长工乙手中牌2、2、A、A、A、K、K、Q、J、10、9、9、8、6、6、4、4

    三家都是明手,互知底牌。要求是:在三家都不打错牌的情况下,地主必须要么输要么赢。问:哪方会赢?

    无解 地主怎么出都会输

 

    【20】一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最大的一颗?

    先拿下第一楼的钻石,然后在每一楼把手中的钻石与那一楼的钻石相比较,如果那一楼的钻石比手中的钻石大的话那就把手中的钻石换成那一层的钻石。

 

    【21】U2合唱团在17分钟 内得赶到演唱会场,途中必需跨过一座桥,四个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一次同时最多可以有两人一起 过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同,若两人同行则 以较慢者的速度为准。Bono需花1分钟过桥,Edge需花2分钟过桥,Adam需花5分钟过桥,Larry需花10分钟过桥。他们要如何在17分钟内过 桥呢?

    2+1先过                          2

    然后1回来送手电筒                 1

    5+10再过                         10

    2回来送手电筒                      2

    2+1过去                           2

总共2+1+10+2+2=17分钟

 

    【22】一个家庭有两个小孩,其中有一个是女孩,问另一个也是女孩的概率(假定生男生女的概率一样)

    1/3

样本空间为(男男)(女女)(男女)(女男)

A=(已知其中一个是女孩)=)(女女)(男女)(女男)

B=(另一个也是女孩)=(女女)

于是P(B/A)=P(AB)/P(A)=(1/4)/(3/4)=1/3

     

    【23】为什么下水道的盖子是圆的?

    不会掉下去

    【24】有7克、2克砝码各一个,天平一只,如何只用这些物品三次将140克的盐分成50、90克各一份?

    140->70+70  70->35+35

    35+70=105

    105->50+7 + 55+2

    55+35=90

 

    【25】芯片测试:有2k块芯片,已知好芯片比坏芯片多.请设计算法从其中找出一片 好芯片,说明你所用的比较次数上限. 其中:好芯片和其它芯片比较时,能正确给出另一块芯片是好还是坏. 坏芯片和其它芯片比较时,会随机的给出好或是坏。

    把第一块芯片与其它逐一对比,看看其它芯片对第一块芯片给出的是好是坏,如果给出是好的过半,那么说明这是好芯片,完毕。如果给出的是坏的过半,说明第一块芯片是坏的,那么就要在那些在给出第一块芯片是坏的芯片中,重复上述步骤,直到找到好的芯片为止。

 

    【26】12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重)

    12个时可以找出那个是重还是轻,13个时只能找出是哪个球,轻重不知。
  把球编为①②③④⑤⑥⑦⑧⑨⑩⑾⑿。(13个时编号为⒀)
  第一次称:先把①②③④与⑤⑥⑦⑧放天平两边,
    ㈠如相等,说明特别球在剩下4个球中。
      把①⑨与⑩⑾作第二次称量,
      ⒈如相等,说明⑿特别,把①与⑿作第三次称量即可判断是⑿是重还是轻
      ⒉如①⑨<⑩⑾说明要么是⑩⑾中有一个重的,要么⑨是轻的。
        把⑩与⑾作第三次称量,如相等说明⑨轻,不等可找出谁是重球。
      ⒊如①⑨>⑩⑾说明要么是⑩⑾中有一个轻的,要么⑨是重的。
        把⑩与⑾作第三次称量,如相等说明⑨重,不等可找出谁是轻球。
    ㈡如左边<右边,说明左边有轻的或右边有重的
      把①②⑤与③④⑥做第二次称量
      ⒈如相等,说明⑦⑧中有一个重,把①与⑦作第三次称量即可判断是⑦与⑧中谁是重球
      ⒉如①②⑤<③④⑥说明要么是①②中有一个轻的,要么⑥是重的。
        把①与②作第三次称量,如相等说明⑥重,不等可找出谁是轻球。
      ⒊如①②⑤>③④⑥说明要么是⑤是重的,要么③④中有一个是轻的。
        把③与④作第三次称量,如相等说明⑤重,不等可找出谁是轻球。
    ㈢如左边>右边,参照㈡相反进行。
  当13个球时,第㈠步以后如下进行。
    把①⑨与⑩⑾作第二次称量,
    ⒈如相等,说明⑿⒀特别,把①与⑿作第三次称量即可判断是⑿还是⒀特别,但判断不了轻重了。
    ⒉不等的情况参见第㈠步的⒉⒊

 

    【27】100个人回答五道试题,有81人答对第一题,91人答对第二题,85人答对第三题,79人答对第四题,74人答对第五题,答对三道题或三道题以上的人算及格, 那么,在这100人中,至少有( )人及格。

    首先求解原题。每道题的答错人数为(次序不重要):26,21,19,15,9

    第3分布层:答错3道题的最多人数为:(26+21+19+15+9)/3=30

    第2分布层:答错2道题的最多人数为:(21+19+15+9)/2=32

    第1分布层:答错1道题的最多人数为:(19+15+9)/1=43

    Max_3=Min(30, 32, 43)=30。因此答案为:100-30=70。

    其实,因为26小于30,所以在求出第一分布层后,就可以判断答案为70了。

     

    要让及格的人数最少,就要做到两点:

    1. 不及格的人答对的题目尽量多,这样就减少了及格的人需要答对的题目的数量,也就只需要更少的及格的人

    2. 每个及格的人答对的题目数尽量多,这样也能减少及格的人数

    由1得每个人都至少做对两道题目

    由2得要把剩余的210道题目分给其中的70人: 210/3 = 70,让这70人全部题目都做对,而其它30人只做对了两道题

    也很容易给出一个具体的实现方案:

    让70人答对全部五道题,11人仅答对第一、二道题,10人仅答对第二、三道题,5人答对第三、四道题,4人仅答对第四、五道题

    显然稍有变动都会使及格的人数上升。所以最少及格人数就是70人!

     

    【28】陈奕迅有首歌叫十年吕珊有首歌叫3650夜那现在问,十年可能有多少天?

    十年可能包含2-3个闰年,3652或3653天。

    1900年这个闰年就是28天,1898~1907这10年就是3651天,闰年如果是整百的倍数,如1800,1900,那么这个数必须是400的倍数才有29天,比如1900年2月有28天,2000年2月有29天 。

 

    【29】1,11,21,1211,111221,下一个数是什么?

    下行是对上一行的解释 所以新的应该是3个1 2个2 1个1 :312211

 

    【30】烧一根不均匀的绳要用一个小时,如何用它来判断半个小时?烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?(微软的笔试题)

    一,一根绳子从两头烧,烧完就是半个小时。

    二,一根要一头烧,一根从两头烧,两头烧完的时候(30分),将剩下的一根另一端点着,烧尽就是45分钟。再从两头点燃第三根,烧尽就是1时15分。

 

 

 

 

 

 

 

Posted by 陈着 Oct 06, 2010 07:23:15 AM