ACMer程序员智力拾遗

       浏览网页偶得,遂记录下来,每天进步一点点……

       博客园真是个不错的平台,今天我让师姐也注册了……

       学会分享吧,孩子们……

一、编程中无穷大量的设置

       如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。

  1. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]; 我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。
  2. 除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。

       所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确以前见到过南阳理工的同学用过,当时没注意,今天再次看到,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。

  1. 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
  2. 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需memset(a,0x3f,sizeof(a))。所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。

二、全排列被8整除

       给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。 输入格式: 多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。 输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。

       全排序方法在我之后审题中被抛弃了,因为这道题不能够用全排序,里面有个条件很苛刻。全排序方法在我之后审题中被抛弃了,因为这道题不能够用全排序,里面有个条件很苛刻。其实,这道题使用归纳法比较好,为什么?题目有提示 非负整数的位数不超过10000位 ,这意味着什么呢?非负整数的长度可能达到9999位,如果这么大的数使用全排序,估计计算机要死了,更何况我家自用开发机是8年前的老古董,想的出这种馊主意,它肯定受不了了。所以要借助归纳法,为什么可以用归纳法?呵呵,我猜的,别笑,我说得是实话,我猜测它可以使用归纳法,那么就得找出它遵循什么规律了,下面开始做一些假设过程:

         

三、结束语

       碰到问题,想都不想的去做,结果只有一种,徒劳无功,倒不如什么都不做。这道题我开始也是全排序,因为胸有成竹嘛,但是后来仔细看题后,发现问题不是那么回事,有一个可能很难达到的要求,就是位数达到9999位怎么计算?所以,最后我认真的分析了一下发现它似曾相识。呵呵。

       感谢大神的贡献,我要站在巨人的肩膀上,不过现在只能站在老王肩膀上了,嘻嘻……

时间: 2024-11-08 22:37:44

ACMer程序员智力拾遗的相关文章

【严肃脸】程序员智力水平与术语思维能力测试,等你来挑战

简评:程序员哇,你的技术数据和理解能力到底过不过关,是不是真的将这些技术知识都融汇贯通了呢?那么就来这里挑战一下吧!吼吼吼 1. 老会计喝二锅(打一热门技术) 2. 梦中交谈(打一热门技术) 3. 连胜六场又赢了(打一知名操作系统) 4. 小米大合唱(打一著名互联网厂商) 5. 男女生都一样(打一技术术语) 6. 不达目的誓不罢休(打一著名网络解决方案提供商) 7. 席卷天下,包举宇内,囊括四海,并吞八荒(打一互联网技术) 8. 话又说回来了(打一网络安全术语) 9. 禽流感(打一常见的PC/服

[观点]程序员需要智力游戏吗?

译文链接:[观点]程序员需要智力游戏吗?

程序员是否值那么多?

记录片<次郎寿司之梦>(Jiro Dreams of Sushi,2011)里有个很牛的场景----世界上最著名的寿司师傅转身对他儿子(将要去开一家自己的餐馆)说:你无家可归了.面对这一幕当你仔细一想,就会发现这父亲的话其实并不让人觉得太过严苛或沮丧,实际上这是对一个正要开展新旅程的人的最佳说法了. 去年十月我辞了职,成为一个自由写手.写作只赚到了900美元,但我最新的作品,一份关于Douglas Hofstadter档案,吸引了两家美国大杂志的兴趣.我得到了大概10,000到20,000美元

为什么程序员都是夜猫子 电脑屏幕惹的祸?

一种很流行的说法是,程序员是把咖啡因转化成程序代码的机器. 说的是实情,随便问一个程序员,问他什么时候工作最有状态,估计他很有可能说是深夜.有人稍微早一点,有人更晚.有一种流行的趋势是凌晨4点起床,在破晓之前这段时间里做一些事情.而另一些人喜欢凌晨4点才睡觉. 所有这些的主要目的是躲避打搅.但是你把自己反锁在屋里不就行了?为什么对夜晚情有独钟? 我想,这事归纳下来有3点:工人的时间表,疲倦的大脑和明亮的电脑屏幕. 工人的时间表 Paul Graham 在2009年写了一篇关于 工人的时间表的文章

为什么软件程序员的价值总是被严重的低估

在我任职于雅虎期间(大约2001-2007),我学会了做很多事情,但同等重要的,我还学会了如何避免做某些事情.对于后者,主要就是如何避免不公的对待技术人员.雅虎,尽管做出了很多善意的努力和明显的例外举措,仍然没有在公司内带来技术人员地位的提高.尽管我们这些技术人员创造了大量的价值,可管理层永远都是非技术人员.不可避免的,大量优秀的人才注意到了这些,忍无可忍,愤而离开. 在2007年离开雅虎后,我和别人合作创立的Polyvore,从这时开始,我的一个人生主要目标就是,要建立一个高度重视技术人员.将

程序员面试资源大收集(转)

资源一:<crack the code interview>--谷歌资深技术面试官经典之作 本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网Jay13补充. 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2.4 求由两个链表结点组成的数

程序员成长规划

引言 我的程序员成长之路 程序员的成长经历往往很相似,大部分的人走过了最前面相同的一段路,而有的人则走得更远.总结自己这些年来的历程,这也许能让年轻的程序员少走一些弯路,成长得更快:或许更好一些,能让大家从中得到一些启发,早日进入优秀程序员的阶段,实现梦想,释放激情. 第一阶段,最初是在学校里学习计算机基础知识,学习经典的程序设计语言,编写测试用的小程序.这个过程可以说是对计算机和程序设计的入门阶段.这个阶段主要是培养了自己对计算机软件的兴趣,打下了良好的计算机基础知识. 第二阶段,而后参加工作

怎样尊重一个程序员

得知一位久违的同学来到了旧金山湾区,然而我见到他时,这人正处于一生中最痛苦的时期.他告诉我,自己任职的公司在他加入之前和之后,判若两人.录 取的时候公司对他说,我们对你在实习期间的表现和学术背景非常满意,你不用面试,甚至不用毕业拿学位,直接就可以加入我们公司成为正式员工.然而短短一年 后的今天,这位同学已经完全感觉不到公司对自己技能的尊重.Manager让他做一些乱七八糟没技术含量的事情,还抱怨说他做事太慢,并且在他的 evaluation上很是写了一笔.在人格尊严和工作安全感的双重打击之下,这

再谈“我是怎么招聘程序员的”(上)

原文链接:http://coolshell.cn/articles/4506.html 我以前写过一篇"我是怎么招聘程序员的"的文章(在CSDN那里有很多人进行了回复).今天,我想再谈谈关于招聘和面试这方面的东西,主要是以下这些原因: 近半年来我在进行了大量的招聘工作,对面试有一些新的体会. 酷壳最近发布了几篇趣味面试题(面试题一,面试题二,面试题三),从回复中让我有一些思考. 我有一个同事最近面试了一家公司,他和我分享了一个博士专家对他的面试,也让我思考了一些. 在豆瓣上看到&quo