‘壹’ 逻辑思维对一个程序员是有多重要
逻辑思维是什么?
老总:这个改一下。
程序猿:好的。。。
改好了,改版1.java
老总:这个再改一下、
程序猿:好的。。。
改好了,改版2.java
老总:这个再改一下、
程序猿:好的。。。
改好了,改版3.java
............................
直到最后........
老总:算了算了,重新写一个。
程序猿:(自个儿脑补暴漫的那张图.)
‘贰’ 推荐几本训练程序员逻辑思维的书籍!!!
想要真正的了解JAVA思想看逻辑思维能力是没多大关系的,
记得我刚开始学的时候,老是搞不懂什么叫面向对象,即使有定义,能解释出来也往往不能运用得当,建议刚开始学的时候不必太深究每个词语的定义。这需要一个过程,当你真正开始写程序后,写的多了。自然而然的就理解了。
希望你能成功。
逻辑思维的书的话,推荐你去买《哈弗大学的1000个益智游戏》
‘叁’ 谁有java程序员思维逻辑题(附带答案),发给我一份。
发我一份吧 358464600
‘肆’ 如何程序员提高自己的逻辑思维
1、 学习一门脚本语言
可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:
处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)
遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量
学会用各种print之类简单粗暴的方式进行调试
学会用Google (phrase, domain, use reader to follow tech blogs)
为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。
2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
Source Insight (或 ctag)
使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。
3、 熟悉Unix/linux Shell和常见的命令行
如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧
一定要少用少用图形界面。
学会使用man来查看帮助
文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
学会使用一些文本操作命令 sed/awk/grep/tail/less/more …
学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…<</p>
了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
了解正则表达式,使用正则表达式来查找文件。
对于程序员来说Unix/Linux比Windows简单多了,学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。
4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)
未来必然是Web的世界,学习WEB基础的最佳网站是W3School。
学习HTML基本语法
学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)
学会用 Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。
学习使用Javascript操纵HTML元件。理解DOM和动态网页,网上有免费的章节,足够用了。或参看 DOM 。
学会用 Firefox + Firebug 或 chrome 调试<</p>
在一台机器上配置Apache 或 Nginx
学习PHP,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。
把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)
跟完一个名校的网络编程课程,不要觉得需要多于一学期时间,大学生是全职一学期选3-5门课,你业余时间一定可以跟上
学习一个+ Ajax (异步读入一个服务器端图片或者数据库内容)+JSON数据格式。
HTTP: The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)
做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)
买个域名,租个空间,做个自己的网站。
‘伍’ 高IQ的请:最不简单的逻辑思维题——能做出来的就是智力高的,越快你IQ越高!
确实可以三次完成。
羽扇仙的答案(不管是自己写的还是从哪里抄的)的确是对的。我在草稿纸上画了一个树形图从头到尾仔细分析了过了。
要我在半小时之内验证一个答案是否正确这没什么问题。但是要我自己想出这样一个解答,我自认为在一个小时内难以完成。至于要想出一个比之更好的解答,我对此不作奢望。
所以我只是谈谈感想,简单评论一下。
最初一秒钟确实会想把12分成两个6,但是马上就意识到是不行的(居然还有那么多人提交了这种答案,有点小小的吃惊);然后就想按照分3组的方式进行下去,仔细一做才发现三次不行;接着猛然想到虽然一开始不知道这个次品的轻重,但是可以记录每一次的结果,利用这个,说不定就可以控制正在三次以内呢?做了一下,做成了,高兴了不到一分钟,发现弄错了——我做成的其实是9个砖头的情况。(回想一下,大概是受到了简单的迭代递归的思维习惯的影响)
于是又要重新做,发现按照通常的做法,12个砖头,第一称如果相等,接下来的各种分支都很容易,而且也都在3次以内;但是倘若第一称不相等,就不好办了。头脑清楚,并且说必须要四次才行的人,估计都是在这里卡住了。但是许多时候,即使我们至今为止没有找到任何可行的方法,也并不就因此证明了不存在任何可行的方法。关于一件事的可行性或者不可行性的证明当然也是有的;但是可惜的是,在这里那些说三次不可行的人并没有真的证明不存在任何可行的方法。
于是我把羽扇仙的答案认真地看了一下,我想既然写得这么详细(虽然繁琐),此人肯定是花费了一番心思验证过的,不要无视人家的劳动成果(我看的时候并不清楚这是不是抄的)。确实,这个答案比较繁琐,但是比起那些只有一两句没头没脑的答案来说,这实在好得太多了。对那些自己随随便便就写出一个想当然的答案、也没有耐心看完其他解答的人,我想说的是:这种工作是来不得半点浮夸的;真要是能证明,就应该能够把详细过程写出来,同时也要有耐心看这样的详细工作。(当然,如果不在乎这些,没有耐心也没关系,那就把这些当过眼烟云吧,以玩票的态度来对待吧,反正也不是自己本职工作,也不是当什么论文审核人。)
再回到羽扇仙的答案。一批人望而却步是因为没有耐心。另一些人可能看到了中间就看不下去,大概由于排版上的某些问题影响了阅读吧。而且通篇这种刻板的“如果...则...否则...”的方式看起来恐怕也相当倒胃口(对这些东西已经习以为常到麻木的程序员们就不会觉得倒胃口,这也许是因为有更深层次的审美,也许是因为已经没有胃口可倒了)。题目本身的难度和解答本身的繁琐也许是更大的原因:在第一称不相等的这个分支,其解法固然是对的,但是很不直观,需要看的人自己去慢慢理顺(最好是画个树形图来分析)。这里我就不写出来了。既然楼主已经知道三次是可能的,必定是验证过的,我也不用多费笔墨唇舌。对于其他看官来说,我要是写得不够详细,那还不如看原来的解答;写得太详细又嫌罗嗦。正确答案其实早就在那里。要是有心的话,与其花时间看我写的,不如自己去花时间理顺一遍,这并不需要什么过人的创造力,需要只是细致和耐心(我相信能从开头看到这里的人已经非常有耐心了)。
真正有些原创性的可能还是xiaozhu36955的解答。虽然我第一眼也对其不屑一顾,第二眼就知道其解答不符合“题意”,就像pjw258所说,对跷跷板的次数进行了“非法”的使用(如果按照“正确”的使用方式,也就是我们解这道题时所默认的那种使用方式,xiaozhu36955的解答当然是无法保证在3次以内的,只能保证在6次以内(运气好的话只要2次,运气差就要6次))。然而这个解答成功地跳出了我们默认的框框,进行了创造性地发挥。虽然要想到羽扇仙那个答案也需要突破许多束缚,但是二者不是在同一个层面上的突破。其实如果真要在现实场景中去找那块重量异常的砖头,我还宁愿用xiaozhu36955的方法,简单易行;而羽扇仙的方法固然称的次数少,但是在称之前和称之后脑子里都要绕好多弯弯,还要记录称的结果,不断回顾与比较,有这闲工夫,早就用xiaozhu36955的方法(或者其他笨办法)找到那块砖头了。(但是假如任务不是称砖头,而是称成吨的钢材,花点时间思考怎样尽量减少称的次数以降低成本还是很有实际用途的;又比如还是称砖头,但是不是一次性的,而是每一批货都要检查重量异常的砖头,那么第一次花点时间想出最少称重次数的方法,将之程序化,以后就方便了。)
给我两天时间,我会给出解答。如果两天后我没有提供任何解答,或者给出的解答是错误的,那就把分数给pjw258吧。
在给出我的解答之前,先简要评论一下这些天来新出现的四种解答。
新出现的解答有:
1、QQ850912617(以下简称QQ同学)——第一次5:5
2、姜胖大人——第一次4:4;不相等的话,第二次称就把其中一边的4个平均分成两份分别放在跷跷板两边,另一边的4个取两个分别放在跷跷板两边
3、278102649(以下简称27同学)——第一次4:4;不相等的话,第二次称就把左右各拿走一个,并把左右各取一个对调
4、1645425——力矩平衡大法
最后这一种虽不是标准解法,但是正因如此,才显得很有意思。我忍不住要把1645425称作物理小王子了,希望你再接再厉,发明出更多更新奇的物理称法。
第一种和第三种称法都是称不出来的。实际上,在掌握了下面我给出的一般方法之后(是的,我给出的是一般方法,这个方法适用于所有使用天平在n个砖头中找出唯一那个次品的问题),就很容易看出,在12个砖头中寻找1个次品,如果限定三次之内完成,那么第一次称只能是4:4,每一边的个数既不能大于4,也不能小于4。所以QQ同学在第一次称重的时候就注定了不可能三次完成。而27同学的失误则发生在第二次称重,不是“好像还差一点”的问题,如果你不改变第二次称重方案的话,永远也不可能在三次以内完成。这些都可以按照我给出的方法得到证明。
姜胖大人的方法是可以做出来的,不过存在细节上失误。大人原话是这样说的:“假设第一次左边,即1234重,那么第二次称127和348。如果平衡,那么异常球在56里且轻;如果还是左边重,那么异常球在128里且为重;如果右边重,那么异常球在347里且为轻”。仔细分析就会发现,如果左边(或右边)重,那么只能说异常球在128里(或在347里);加上“且为重(且为轻)”不仅是画蛇添足,而且是错的。(当然,平衡的情况下说“异常球在56里且轻”是正确的。)如果抛开这些失误,那么姜胖大人的方法是唯一一种这样的方法,即:在第一次称重不平衡的情况下,第二次称重不需要借助这8个砖头之外的任何砖头(即第一次称之后已被证明为正常的那4个砖头)。
当然,楼主见过的2种不同方法,其中一种大概是和姜胖大人一样的。
以下是我的解答:
先别急着动手。在做之前,先分析一下称重的作用。每一次称重的作用无非是令我们排除一些可能,缩小搜索范围,判断出重量异常的那个次品在哪个范围内,并确定下一步该如何称。而做到这一点,仅仅是通过观察称重的结果。每一次称重的结果最多有三种可能:左>右;左=右;左<右。可是,由于不知道次品和正品孰轻孰重,因此左和右孰轻孰重对于我们下判断做决定便不能构成任何区分,我们只能说两边相等或者不相等。但是,倘若之前有一次称重的结果也是不相等,那么本次称重的结果相对于之前那一次称重的结果就可以区分出三种可能了,也就是说,这时候的左大于右还是右大于左,在之前那一次不相等的称重背景下就有了区分的意义。
所以每一次称重,也许能区分出三种可能,也许能区分出两种可能。能够区分出多少种可能,接下来就会有多少个分支。当然仅有一种可能结果的称重也是有的:所谓只有一种可能结果的称重,就是说,我们在这次称重之前就能推断出是哪一种结果。这样的称重当然是毫无作用的,所以不要把称重次数浪费在只有一种可能结果的称重上。
排除了这种无用的称重,那么每一次称重接下来的分支可能有两条或三条。更准确的说,如果之前从来没有出现过不相等的称重,那么当前这次称重最多只能有两条分支——相等或者不相等;如果之前出现过不相等的称重,那么此次称重最多可以有三条分支——相等、和前面那次不相等的称重方向一致或者相反。
现在要确定一下使用的记号。A和B是两个集合,其元素都是砖头,A:B表示把A中所有砖头放在跷跷板左边,B中所有砖头放在跷跷板右边,来称重。我们用g(A)表示A的重量,g(A)=g(B)表示跷跷板平衡。现在我们要考虑:不平衡的时候采用什么记号?我们可以用g(A)≠g(B)表示跷跷板不平衡,但是为了和以后称重中可能出现的不平衡相比较(方向一致或者不一致),我们采用这种记法:A∧B,表示g(A)>g(B)(或g(A)<g(B));相应的我们引入A∨B,表示g(A)<g(B)(或g(A)>g(B))。也就是说∧表示大于或者小于,但究竟是大于还是小于并不确定,也不重要。关键是,当∧表示“大于”的时候,∨表示“小于”;当∧表示“小于”的时候,∨表示“大于”。当然,我们也可以采用其他记法:
1、直接在每次不平衡的时候说“大于(或者小于)”以及“小于(或者大于)”;
2、用类似∧∨这样一对符号来表示1中的意思;
3、只使用一个符号(比如∧),但是在说A和B不平衡的时候,详细说出究竟是A∧B,还是B∧A,以示区别。
要注意两点:
第一,以上2和3中的符号都应该表示反对称关系。([R是反对称的]当且仅当[对于任何xy,若xRy为真则yRx为假]),上面出现的<>∧∨都是这样的关系。而=和≠都是对称关系([R是对称的]当且仅当[对于任何xy,若xRy则yRx]。)
第二,2中的两个记号所表示的两个反对称关系应该互为镜像。(设S和R都是反对称关系。[S和R互为镜像]当且仅当[对于所有xy,xSy当且仅当yRx]。)
当使用表示一对互为镜像关系的符号,并且在比较的双方已知的情况下,我们采用下面的简写:在比较A:B的时候,“A∧B”简写为“∧”,“A∨B”简写为“∨”(同时,“A=B”也简写为“=”)。我们可以采用自己喜欢的记号,只要不引起歧义就行。比如我最初在草稿纸上写的时候就只用一个向上的箭头↑,写的时候就“A↑B”“B↑A”这样写;后来也上下两种箭头一起用(↑↓),写的时候就只写“↑”或“↓”。或者,用0代替=,1代替∧,-1代替∨,也是可以的。
下面我要引入树形图来帮助解题,它将贯穿下面所有的证明。
一个树形图由有限个点和有限条线构成,每条线都自上而下联结两个点,其中上面的点称为下面的点的父结点,下面的点称为上面的点的子结点。一个点如果没有任何父结点,就称之为根。一个树有且仅有一个根结点。除了根结点,其他每个点都有且仅有一个父结点。每个点都可以有若干个子结点,子结点之间没有线相连。一个点如果没有任何子结点,就称之为叶子。如果从根节点出发到达某个结点需要经过n条线,那么这个结点就在第n层(注意:根结点在第0层)。组成这棵树各个结点的最大层次就是这棵树的深度。
我们要用到的树就是这样,但是为了满足这道题的具体需要,还需做一些细化。
假设我们要从砖头集合U中找出那个异常元素。我们让一棵树除了叶结点以外的每个结点都对应一个二元组<X,Y>。其中X是U的子集,表示经由前面所有步骤判断出那个异常元素所属的范围;Y则表示A:B这样一个称重操作,其中A、B都是U的子集,且A与B没有交集,而且A和B的元素个数要相等(我们不知道正常与异常砖块的重量比,也不使用力矩称法,所以只能在跷跷板两边放置同等数量的砖块)。而每个叶结点对应U的一个子集,并且是单元集(即只含有一个元素的集合),叶结点上不再需要称重操作,因为已经确定异常元素是哪一个了。以后,在不会引起歧义的地方,我们直接把某个结点对应的判断和操作简称为判断和操作。我们还要给每条线都标上=∧∨这些记号。它们表示这条线上端那次操作的结果,如果上端那个操作是A:B,那么=∧∨分别表示g(A)=g(B),A∧B,A∨B。标注着不同记号的线导向相应的下端判断或操作。从现在起,我们有时也称一棵树为一个策略。
我们在前面说过,如果一次称重之前不存在至少一次不相等的称重结果,那么此次称重最多只能分出两种可能;否则,最多能分出三种可能。也就说,如果在一个结点之前,还不曾有过某条线(这条线不一定是紧接着这个结点的,但是必须能够经由这个结点向上通达到)被标记为∧或∨,那么这个结点的分支数最多两条;否则分支数最多三条。现在我们按照这一规则,从一个根结点开始向下分叉,并且使得深度不超过3。将每个结点下面的分支数目以及树的深度最大化,就得到下面的树形图。
这棵树的叶结点一共14个,但是从14个砖头里找到一个重量异常砖头的任务是不可能确保在三次内完成的,因为还需考虑以下限制。
如果只关注每个结点处的判断集合,即判断异常砖块所属的那个集合,那么下面几项条件限制着每个结点上集合(但没有穷尽所有限制)。
首先,一个策略的叶结点必须都是单元集,否则这个策略还是未完成的;
其次,一个结点上的集合恰好分割成它的子结点上的集合,即:一个结点的子结点上的集合互不相交,并且这些子结点对应集合的并集就等于该结点上的集合;
第三,一个结点下方所有叶结点的个数必须等于该结点对应集合的基数(即它的元素个数)。
(第三点可由前两点推出)
我们看到图中这棵树的根结点向下分为两棵子树,左边的子树有5个叶结点,右边的子树有9个叶结点。根结点上的集合就是U(就是任务开始时所给砖头的集合),而根结点上的操作则是A:B,其中A和B都是U的子集,且互不相交。根结点向下分出两支,分别对应着A=B时的操作和A∧B时的操作。若A=B,则异常砖块一定不在A或B当中;因此,在A=B这一分支下的子结点上的集合等于U-(A∪B)。若A∧B,则异常砖块一定在A或B当中;因此,在A∧B这一分支下的子结点上的集合等于A∪B。由于A和B的基数相等,假设A的基数为a(a为正整数),则A∪B的基数就等于2a。因此,右边子树下的叶结点数目必须是偶数。有了这个限制条件,且又知道深度为3的树的右边子树的叶结点最多有9个,于是我们知道右边子树的叶结点最多有8个。8和左边子树的叶结点数目5相加就是13。这就证明了不存在三步以内的策略,能够将大于等于14个砖块中的异常砖块找出来。
由上面的设定还可以知道,若U的基数为w,则U-(A∪B)的基数为(w-2a)(因A的基数是a,且A和B基数相同),也就是左侧子树的叶结点数要等于w-2a,且由于深度不大于3的树左侧叶结点数最多是5,于是w-2a≤5;类似的,右侧子树的叶结点数要等于2a,且由于深度不大于3的树左侧叶结点数最多是9,于是2a≤9。解出来就是(w-5)/2≤a≤9/2。若w=12,则a只能为4(若w=13,a也只能为4)。
(未完待续。抱歉,今天拉肚子,不然现在就写完了。上面已经证明的结论:在n块砖里找出一块异常砖头,且能够保证在三次以内完成的,n不能大于13;当n=12,第一次称重必须为4:4。明天将证明:n=12时,有10种方案可以3次完成;n=13时,有12种方案可以3次完成。我相信根据我上面给出的线索,已经有很多人知道该怎么做了。)
‘陆’ java程序员做后端的,如何锻炼逻辑思维经常被困惑,感觉要疯了,有没有更好的办法急急急!
很简单啊,提高自己的算法和数据结构能力,是锻炼一个程序员逻辑思维能力的最好方法。
最好找一本国外的算法与数据结构的书,最好有课后习题答案的,一章一章啃,尽量完成课后习题。一本啃下来,自己的水平会有质变的。因为编程所遇到的大部分算法逻辑,都演化于算法与数据结构中的经典算法。
另外呢,还要提高整体逻辑,就是各种架构的逻辑。虽然这些逻辑本质上也是演化来的,但是在不同场景的应用就会有不同的改编。理解了这些逻辑,甚至可以自己从0开发后端系统。最好的方法是,学习框架,然后读源码。学习框架不是学习如何用,而是学习如何写,如何设计。但是框架很多,最好从你最熟悉的入手,如果有权威教材,啃教材很不错。每一个框架的逻辑都是很优美的,如何根据场景最大化效率,鲁棒性,安全性,如果你把数据结构和算法基础打牢了,会理解的。
当然说起来容易做起来难,如果你真的能做到上面这些,逻辑早就不是困扰你的问题了,而是可以成为一个非常厉害的大牛了。
‘柒’ 程序员的逻辑思维会对生活产生什么影响
对让生活变得特别规律和枯燥,他会用逻辑思维去想一件事,特别累,也接受不了他每天这样思考,生活无趣。
‘捌’ 开心一该~!程序员逻辑思维问题
先说这里有话误导人!
我先算算……
知道了!小二的两个子儿不算付钱!
应该算上还穷书生的
问题本身是错的
这种问题最变态了……
而且LZ这个问题有点老了,我都忘了怎么算了
要想把小二的放进去应该是
老板25+小二2+书生收3=书生付30
或者改一下所谓题目
书生付27+书生收3=30
小二的钱怎么乱放公式呢!
硬是把小二的放进去的话我再想想
不可能的,基本上我写的公式都可以转换过来的
‘玖’ 作为一个初级程序员,感觉自己逻辑思维能力不是特别好。请问有什么锻炼编程方面逻辑思维能力的方法吗
当然是多写程序啦,一定要自己多码代码,写的多了自然什么都好了。亲身体会