结构工程师笔试题题(基础却又没多少人做对的面向对象面试

&figure&&img src=&https://pic4.zhimg.com/v2-60f0dae96ef42b8f4c7dbbe6e12483c4_b.jpg& data-rawwidth=&1728& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1728& data-original=&https://pic4.zhimg.com/v2-60f0dae96ef42b8f4c7dbbe6e12483c4_r.jpg&&&/figure&&blockquote&&p&最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的面试题&/p&&/blockquote&&h1&一、题目&/h1&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public class Base
private String baseName = &base&;
public Base()
callName();
public void callName()
System. out. println(baseName);
static class Sub extends Base
private String baseName = &sub&;
public void callName()
System. out. println (baseName) ;
public static void main(String[] args)
Base b = new Sub();
&/code&&/pre&&/div&&p&求这段程序的输出值?&/p&&h1&二、解题&/h1&&p&因为本身一开始我也做错了这道题,因此不好写一开始的思考思路,我们就用最直接的方法来看下答案是什么?&/p&&p&直接把程序运行,看输出的结果:&/p&&br&&figure&&img src=&http://pic1.zhimg.com/v2-f5d6f3c1e42f2cd4575d8_b.png& data-rawwidth=&742& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&742& data-original=&http://pic1.zhimg.com/v2-f5d6f3c1e42f2cd4575d8_r.png&&&/figure&&br&&p&可以看到,结果为 null 。为什么呢?&/p&&p&我们在仔细的观察一下题目,可以知道,这道题无非就是考察我们三个知识点,第一,类的加载机制以及类的初始化过程;第二,继承的相关知识,其中这里涉及到子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏;第三,多态性,多态性就是让实现与接口进行分离,在这道题目中,在父类的构造方法中调用了虚函数造成多态&/p&&p&竟然我们上面就提到这个题目就是考察我们三个知识点,那么我们就根据题目对这三个知识点进行逐一击破&/p&&p&1.类加载的机制和程序运行的顺序&/p&&p&我们通过 Debug 能很好的了解程序的运行顺序,因为 new 了一个 Sub 对象,且 Sub 类中没有重写构造函数,因此会调用父类的构造函数,父类 Base 的构造函数中调用了 callName 方法,因此就在父类的 callName 方法中的输出语句打一个断点,最后因为子类的 Sub 重写了 callName 方法, 因此也在子类中重写的 callName 方法中打一个断点。最后通过 debug 我们可以看出程序的运行顺序&/p&&br&&figure&&img src=&http://pic3.zhimg.com/v2-394df14b9c2196fdd6aa42_b.png& data-rawwidth=&709& data-rawheight=&639& class=&origin_image zh-lightbox-thumb& width=&709& data-original=&http://pic3.zhimg.com/v2-394df14b9c2196fdd6aa42_r.png&&&/figure&&br&&p&知道了程序的运行顺序之后,我们还需知道一个知识点,那就是类的实例变量的初始化过程,也就是题目中成员变量 baseName 的初始化过程。&/p&&p&我们都知道,一个类一旦被加载连接初始化,它就可以随时被使用了,程序可以访问它的静态字段,调用静态方法,或者创建它的实例。在 JAVA 程序中类可以被明确或者隐含地实例化有四种途径:(1)明确使用 new 操作符;(2)调用 Class 或者 Constructor 对象的 newInstance() 方法;(3)调用任何现有对象的 clone() 方法;(4)或者通过 objectInputStream 类的 getObject() 方法反序列化。虚拟机创建一个新的实例时,都需要在堆中为保存对象的实例分配内存。所有在对象的类中和它的父类中声明的变量(包括隐藏的实例变量)都要分配内存。一旦虚拟机为新的对象准备好堆内存,它立即把实例变量初始化为默认的初始值。&/p&&p&2.继承&/p&&p&题目中 Sub 类继承了 Base 类,关于继承,一个基本所有人都知道的知识点,不过这里还是贴出来&/p&&blockquote&&p&Java保证了一个对象被初始化前其父类也必须被初始化。有下面机制来保证:Java强制要求任何类的构造函数中的第一句必须是调用父类构造函数或者是类中定义的其他构造函数。如果没有构造函数,系统添加默认的无参构造函数,如果我们的构造函数中没有显示的调用父类的构造函数,那么编译器自动生成一个父类的无参构造函数&/p&&/blockquote&&p&3.多态&/p&&p&父类中的构造函数调用了 callName 方法,在题目中是通过 new Sub() 对象,因此调用的是子类 Sub 类中的 callName 方法,因此当前的 this 是指 Sub 类中的。&/p&&p&好了,最后我们根据运行顺序分析整个过程&br&1.Base b = new Sub();&/p&&p&在 main 方法中声明父类变量b对子类的引用,JAVA类加载器将Base,Sub类加载到JVM;也就是完成了 Base 类和 Sub 类的初始化&/p&&p&2.JVM 为 Base,Sub 的的成员开辟内存空间且值均为 null&/p&&p&在初始化 Sub 对象前,首先 JAVA 虚拟机就在堆区开辟内存并将子类 Sub 中的 baseName 和父类 Base 中的 baseName(已被隐藏)均赋为 null ,至于为什么 Base 类中的 baseName 为什么会被隐藏,上面的知识点也已经说明,就是子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏&/p&&p&3.调用父类的无参构造&/p&&p&调用 Sub 的构造函数,因为子类没有重写构造函数,默认调用无参的构造函数,调用了 super() 。&/p&&p&4.callName 在子类中被重写,因此调用子类的 callName();&/p&&p&调用了父类的构造函数,父类的构造函数中调用了 callName 方法,此时父类中的 baseName 的值为 base,可是子类重写了 callName 方法,且 调用父类 Base 中的 callName 是在子类 Sub 中调用的,因此当前的 this 指向的是子类,也就是说是实现子类的 callName 方法&/p&&p&5.调用子类的callName,打印baseName&/p&&p&实际上在new Sub()时,实际执行过程为:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public Sub(){
baseName = &sub&;
&/code&&/pre&&/div&&p&可见,在 baseName = &sub& 执行前,子类的 callName() 已经执行,所以子类的 baseName 为默认值状态 null 。&/p&&p&时间也很晚了(日01:35:54),最后给出一个知识点就睡了&/p&&blockquote&&p&构造器的初始化顺序大概是:父类静态块 -&子类静态块 -&父类初始化语句 -&父类构造函器 -&子类初始化语句 子类构造器。&/p&&/blockquote&
最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的…
已有帐号?
无法登录?
社交帐号登录
6360 人关注
463 条内容
200 人关注
104 条内容
493 人关注
183 人关注
283 条内容
382 条内容2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)a year ago求这段程序的输出值?二、解题因为本身一开始我也做错了这道题,因此不好写一开始的思考思路,我们就用最直接的方法来看下答案是什么?直接把程序运行,看输出的结果:可以看到,结果为 null 。为什么呢?我们在仔细的观察一下题目,可以知道,这道题无非就是考察我们三个知识点,第一,类的加载机制以及类的初始化过程;第二,继承的相关知识,其中这里涉及到子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏;第三,多态性,多态性就是让实现与接口进行分离,在这道题目中,在父类的构造方法中调用了虚函数造成多态竟然我们上面就提到这个题目就是考察我们三个知识点,那么我们就根据题目对这三个知识点进行逐一击破1.类加载的机制和程序运行的顺序我们通过 Debug 能很好的了解程序的运行顺序,因为 new 了一个 Sub 对象,且 Sub 类中没有重写构造函数,因此会调用父类的构造函数,父类 Base 的构造函数中调用了 callName 方法,因此就在父类的 callName 方法中的输出语句打一个断点,最后因为子类的 Sub 重写了 callName 方法, 因此也在子类中重写的 callName 方法中打一个断点。最后通过 debug 我们可以看出程序的运行顺序知道了程序的运行顺序之后,我们还需知道一个知识点,那就是类的实例变量的初始化过程,也就是题目中成员变量 baseName 的初始化过程。我们都知道,一个类一旦被加载连接初始化,它就可以随时被使用了,程序可以访问它的静态字段,调用静态方法,或者创建它的实例。在 JAVA 程序中类可以被明确或者隐含地实例化有四种途径:(1)明确使用 new 操作符;(2)调用 Class 或者 Constructor 对象的 newInstance() 方法;(3)调用任何现有对象的 clone() 方法;(4)或者通过 objectInputStream 类的 getObject() 方法反序列化。虚拟机创建一个新的实例时,都需要在堆中为保存对象的实例分配内存。所有在对象的类中和它的父类中声明的变量(包括隐藏的实例变量)都要分配内存。一旦虚拟机为新的对象准备好堆内存,它立即把实例变量初始化为默认的初始值。2.继承题目中 Sub 类继承了 Base 类,关于继承,一个基本所有人都知道的知识点,不过这里还是贴出来Java保证了一个对象被初始化前其父类也必须被初始化。有下面机制来保证:Java强制要求任何类的构造函数中的第一句必须是调用父类构造函数或者是类中定义的其他构造函数。如果没有构造函数,系统添加默认的无参构造函数,如果我们的构造函数中没有显示的调用父类的构造函数,那么编译器自动生成一个父类的无参构造函数3.多态父类中的构造函数调用了 callName 方法,在题目中是通过 new Sub() 对象,因此调用的是子类 Sub 类中的 callName 方法,因此当前的 this 是指 Sub 类中的。好了,最后我们根据运行顺序分析整个过程1.Base b = new Sub();在 main 方法中声明父类变量b对子类的引用,JAVA类加载器将Base,Sub类加载到JVM;也就是完成了 Base 类和 Sub 类的初始化2.JVM 为 Base,Sub 的的成员开辟内存空间且值均为 null在初始化 Sub 对象前,首先 JAVA 虚拟机就在堆区开辟内存并将子类 Sub 中的 baseName 和父类 Base 中的 baseName(已被隐藏)均赋为 null ,至于为什么 Base 类中的 baseName 为什么会被隐藏,上面的知识点也已经说明,就是子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏3.调用父类的无参构造调用 Sub 的构造函数,因为子类没有重写构造函数,默认调用无参的构造函数,调用了 super() 。4.callName 在子类中被重写,因此调用子类的 callName();调用了父类的构造函数,父类的构造函数中调用了 callName 方法,此时父类中的 baseName 的值为 base,可是子类重写了 callName 方法,且 调用父类 Base 中的 callName 是在子类 Sub 中调用的,因此当前的 this 指向的是子类,也就是说是实现子类的 callName 方法5.调用子类的callName,打印baseName实际上在new Sub()时,实际执行过程为:public Sub(){
baseName = "sub";
可见,在 baseName = "sub" 执行前,子类的 callName() 已经执行,所以子类的 baseName 为默认值状态 null 。时间也很晚了(日01:35:54),最后给出一个知识点就睡了构造器的初始化顺序大概是:父类静态块 -&子类静态块 -&父类初始化语句 -&父类构造函器 -&子类初始化语句 子类构造器。9收藏分享举报文章被以下专栏收录详解互联网面试题{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&详解互联网面试题&,&permission&:&COLUMN_PUBLIC&,&memberId&:,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&详解互联网面试题&,&urlToken&:&twowater&,&id&:28043,&imagePath&:&v2-faa3b1e995b07e8c9a12d7b78c7ef8ed.png&,&slug&:&twowater&,&applyReason&:&0&,&name&:&【水面试题】&,&title&:&【水面试题】&,&url&:&https:\u002F\u002Fzhuanlan.zhihu.com\u002Ftwowater&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:52,&avatar&:{&id&:&v2-faa3b1e995b07e8c9a12d7b78c7ef8ed&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-faa3b1e995b07e8c9a12d7b78c7ef8ed_l.jpg&,&articlesCount&:9},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-60f0dae96ef42b8f4c7dbbe6e12483c4_r.jpg&,&lastUpdated&:,&imagePath&:&v2-60f0dae96ef42b8f4c7dbbe6e12483c4.jpg&,&permission&:&ARTICLE_PUBLIC&,&topics&:[09],&summary&:&最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T19:33:33+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:2485248,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:28043,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-60f0dae96ef42b8f4c7dbbe6e12483c4_r.jpg&,&author&:{&bio&:&微信公众号:ReadingWithU&,&isFollowing&:false,&hash&:&58f7aade3c0e&,&uid&:951900,&isOrg&:false,&slug&:&liangdianshui&,&isFollowed&:false,&description&:&水天水地水自己&,&name&:&两点水&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fliangdianshui&,&avatar&:{&id&:&v2-b0c28edf16b652af5641197f&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:578275}],&title&:&2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)&,&author&:&liangdianshui&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的面试题\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch1\u003E一、题目\u003C\u002Fh1\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Epublic class Base\n{\n
private String baseName = \&base\&;\n
public Base()\n
callName();\n
public void callName()\n
System. out. println(baseName);\n
static class Sub extends Base\n
private String baseName = \&sub\&;\n
public void callName()\n
System. out. println (baseName) ;\n
public static void main(String[] args)\n
Base b = new Sub();\n
}\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E求这段程序的输出值?\u003C\u002Fp\u003E\u003Ch1\u003E二、解题\u003C\u002Fh1\u003E\u003Cp\u003E因为本身一开始我也做错了这道题,因此不好写一开始的思考思路,我们就用最直接的方法来看下答案是什么?\u003C\u002Fp\u003E\u003Cp\u003E直接把程序运行,看输出的结果:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-f5d6f3c1e42f2cd4575d8_b.jpg\& data-rawwidth=\&742\& data-rawheight=\&600\& class=\&origin_image zh-lightbox-thumb\& width=\&742\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-f5d6f3c1e42f2cd4575d8_r.jpg\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='742'%20height='600'&&\u002Fsvg&\& data-rawwidth=\&742\& data-rawheight=\&600\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&742\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-f5d6f3c1e42f2cd4575d8_r.jpg\& data-actualsrc=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-f5d6f3c1e42f2cd4575d8_b.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cbr\u003E\u003Cp\u003E可以看到,结果为 null 。为什么呢?\u003C\u002Fp\u003E\u003Cp\u003E我们在仔细的观察一下题目,可以知道,这道题无非就是考察我们三个知识点,第一,类的加载机制以及类的初始化过程;第二,继承的相关知识,其中这里涉及到子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏;第三,多态性,多态性就是让实现与接口进行分离,在这道题目中,在父类的构造方法中调用了虚函数造成多态\u003C\u002Fp\u003E\u003Cp\u003E竟然我们上面就提到这个题目就是考察我们三个知识点,那么我们就根据题目对这三个知识点进行逐一击破\u003C\u002Fp\u003E\u003Cp\u003E1.类加载的机制和程序运行的顺序\u003C\u002Fp\u003E\u003Cp\u003E我们通过 Debug 能很好的了解程序的运行顺序,因为 new 了一个 Sub 对象,且 Sub 类中没有重写构造函数,因此会调用父类的构造函数,父类 Base 的构造函数中调用了 callName 方法,因此就在父类的 callName 方法中的输出语句打一个断点,最后因为子类的 Sub 重写了 callName 方法, 因此也在子类中重写的 callName 方法中打一个断点。最后通过 debug 我们可以看出程序的运行顺序\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-394df14b9c2196fdd6aa42_b.jpg\& data-rawwidth=\&709\& data-rawheight=\&639\& class=\&origin_image zh-lightbox-thumb\& width=\&709\& data-original=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-394df14b9c2196fdd6aa42_r.jpg\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='709'%20height='639'&&\u002Fsvg&\& data-rawwidth=\&709\& data-rawheight=\&639\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&709\& data-original=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-394df14b9c2196fdd6aa42_r.jpg\& data-actualsrc=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-394df14b9c2196fdd6aa42_b.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cbr\u003E\u003Cp\u003E知道了程序的运行顺序之后,我们还需知道一个知识点,那就是类的实例变量的初始化过程,也就是题目中成员变量 baseName 的初始化过程。\u003C\u002Fp\u003E\u003Cp\u003E我们都知道,一个类一旦被加载连接初始化,它就可以随时被使用了,程序可以访问它的静态字段,调用静态方法,或者创建它的实例。在 JAVA 程序中类可以被明确或者隐含地实例化有四种途径:(1)明确使用 new 操作符;(2)调用 Class 或者 Constructor 对象的 newInstance() 方法;(3)调用任何现有对象的 clone() 方法;(4)或者通过 objectInputStream 类的 getObject() 方法反序列化。虚拟机创建一个新的实例时,都需要在堆中为保存对象的实例分配内存。所有在对象的类中和它的父类中声明的变量(包括隐藏的实例变量)都要分配内存。一旦虚拟机为新的对象准备好堆内存,它立即把实例变量初始化为默认的初始值。\u003C\u002Fp\u003E\u003Cp\u003E2.继承\u003C\u002Fp\u003E\u003Cp\u003E题目中 Sub 类继承了 Base 类,关于继承,一个基本所有人都知道的知识点,不过这里还是贴出来\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Cp\u003EJava保证了一个对象被初始化前其父类也必须被初始化。有下面机制来保证:Java强制要求任何类的构造函数中的第一句必须是调用父类构造函数或者是类中定义的其他构造函数。如果没有构造函数,系统添加默认的无参构造函数,如果我们的构造函数中没有显示的调用父类的构造函数,那么编译器自动生成一个父类的无参构造函数\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E3.多态\u003C\u002Fp\u003E\u003Cp\u003E父类中的构造函数调用了 callName 方法,在题目中是通过 new Sub() 对象,因此调用的是子类 Sub 类中的 callName 方法,因此当前的 this 是指 Sub 类中的。\u003C\u002Fp\u003E\u003Cp\u003E好了,最后我们根据运行顺序分析整个过程\u003Cbr\u003E1.Base b = new Sub();\u003C\u002Fp\u003E\u003Cp\u003E在 main 方法中声明父类变量b对子类的引用,JAVA类加载器将Base,Sub类加载到JVM;也就是完成了 Base 类和 Sub 类的初始化\u003C\u002Fp\u003E\u003Cp\u003E2.JVM 为 Base,Sub 的的成员开辟内存空间且值均为 null\u003C\u002Fp\u003E\u003Cp\u003E在初始化 Sub 对象前,首先 JAVA 虚拟机就在堆区开辟内存并将子类 Sub 中的 baseName 和父类 Base 中的 baseName(已被隐藏)均赋为 null ,至于为什么 Base 类中的 baseName 为什么会被隐藏,上面的知识点也已经说明,就是子类继承父类的时候,同名的属性不会覆盖父类,只是会将父类的同名属性隐藏\u003C\u002Fp\u003E\u003Cp\u003E3.调用父类的无参构造\u003C\u002Fp\u003E\u003Cp\u003E调用 Sub 的构造函数,因为子类没有重写构造函数,默认调用无参的构造函数,调用了 super() 。\u003C\u002Fp\u003E\u003Cp\u003E4.callName 在子类中被重写,因此调用子类的 callName();\u003C\u002Fp\u003E\u003Cp\u003E调用了父类的构造函数,父类的构造函数中调用了 callName 方法,此时父类中的 baseName 的值为 base,可是子类重写了 callName 方法,且 调用父类 Base 中的 callName 是在子类 Sub 中调用的,因此当前的 this 指向的是子类,也就是说是实现子类的 callName 方法\u003C\u002Fp\u003E\u003Cp\u003E5.调用子类的callName,打印baseName\u003C\u002Fp\u003E\u003Cp\u003E实际上在new Sub()时,实际执行过程为:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Epublic Sub(){\n
super();\n
baseName = \&sub\&; \n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E可见,在 baseName = \&sub\& 执行前,子类的 callName() 已经执行,所以子类的 baseName 为默认值状态 null 。\u003C\u002Fp\u003E\u003Cp\u003E时间也很晚了(日01:35:54),最后给出一个知识点就睡了\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Cp\u003E构造器的初始化顺序大概是:父类静态块 -&子类静态块 -&父类初始化语句 -&父类构造函器 -&子类初始化语句 子类构造器。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E&,&updated&:new Date(&T11:33:33.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:4,&collapsedCount&:0,&likeCount&:9,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-60f0dae96ef42b8f4c7dbbe6e12483c4_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Android 开发&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&程序员&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&移动开发&}],&adminClosedComment&:false,&titleImageSize&:{&width&:1728,&height&:1080},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&twowater&,&name&:&【水面试题】&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:4,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T19:33:33+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&&,&isFollowing&:false,&hash&:&f8acfca1b8b&,&uid&:48,&isOrg&:false,&slug&:&ding-dong-67-53&,&isFollowed&:false,&description&:&&,&name&:&叮咚&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fding-dong-67-53&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&2e435eeb0a2add&,&uid&:684300,&isOrg&:false,&slug&:&ji-ta-mei-you-xian-i&,&isFollowed&:false,&description&:&&,&name&:&一个老实的少年&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fji-ta-mei-you-xian-i&,&avatar&:{&id&:&dfd&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&流浪汉。&,&isFollowing&:false,&hash&:&b29c1ab146f52fe1f48725c83fbfa58e&,&uid&:992800,&isOrg&:false,&slug&:&li-shuai-17-93&,&isFollowed&:false,&description&:&&,&name&:&LSLuna&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fli-shuai-17-93&,&avatar&:{&id&:&v2-3c54f175d51ebb97dd19&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&52fae553f6bbaac0f5e34e&,&uid&:964000,&isOrg&:false,&slug&:&flyyin-shen&,&isFollowed&:false,&description&:&夜深忽梦少年事,梦啼妆泪红阑干。&,&name&:&FLY尹深&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fflyyin-shen&,&avatar&:{&id&:&8ed8973828ebf0e0a5e063&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&a1d02a082d5fa9847b05b&,&uid&:558600,&isOrg&:false,&slug&:&pei-xian-sen-zhu&,&isFollowed&:false,&description&:&&,&name&:&努力努力在努力&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fpei-xian-sen-zhu&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&\u003Cimg src=\&http:\u002F\u002Fpic1.zhimg.com\u002Fv2-f5d6f3c1e42f2cdx112.png\& data-rawwidth=\&742\& data-rawheight=\&600\& class=\&origin_image inline-img zh-lightbox-thumb\& data-original=\&http:\u002F\u002Fpic1.zhimg.com\u002Fv2-f5d6f3c1e42f2cd4575d8_r.png\&\u003E最近真的发现自己越来越懒了,虽然现在有点晚了,可是内疚完之后,还是得更新每个星期一篇的面试题,找了很多面试题,发现有些很基础的就没必要分享出来,最后找了这么一篇经典的面试题,一开始我也还真做错了,话不多说。来看下 2015 携程的 JAVA 工程师的…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002F50\u002Fv2-60f0dae96ef42b8f4c7dbbe6e12483c4_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&程序员&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Java 编程&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&IT 人&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&微信公众号:ReadingWithU&,&isFollowing&:false,&hash&:&58f7aade3c0e&,&uid&:951900,&isOrg&:false,&slug&:&liangdianshui&,&isFollowed&:false,&description&:&水天水地水自己&,&name&:&两点水&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fliangdianshui&,&avatar&:{&id&:&v2-b0c28edf16b652af5641197f&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&twowater&,&name&:&【水面试题】&},&content&:&\u003Ch1\u003E前言\u003C\u002Fh1\u003E\u003Cblockquote\u003E\u003Cp\u003E2017 年,我还是会坚持每周一篇面试题,当然我每周看的面试题肯定是不止一篇的,我是在这周看过的面试题中,选择一题自己认为较好的来写。因为每一篇都写,不现实,写一篇博客,需要的时间也是挺长的,所以选择较好较大众化的题目。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch1\u003E一、题目\u003C\u002Fh1\u003E\u003Cblockquote\u003E\u003Cp\u003E有任意种水果, 每种水果个数也是任意的, 两人轮流从中取出水果, 规则如下:\u003Cbr\u003E1) 每一次应取走至少一个水果; 每一次只能取走一种水果的一个或者全部.\u003Cbr\u003E2) 如果谁取到最后一个水果就胜.\u003C\u002Fp\u003E\u003Cp\u003E给定水果种类 N 和每种水果的个数 M1, M2, ..., Mn, 算出谁取胜.\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch1\u003E二、解题\u003C\u002Fh1\u003E\u003Cp\u003E看到这个题目的时候,我整个人懵逼了,啥,到底是叫我做什么?一脸懵逼,然后再看题目,又重新看题目,才发现,题目有个隐含的条件,就是 这两个人足够聪明,充分利用了规则。 可是单单凭借这一点,还是不知道该从何下手,其实这题是 必胜策略题,可以通过用递推的方式找一下规律解决该题。\u003C\u002Fp\u003E\u003Cp\u003E在递推之前,我们先来看看题目中一共给出了什么条件:\u003Cbr\u003E1.N 种不同的水果\u003Cbr\u003E2.每种水果的个数分别为:M1, M2, ..., Mn,\u003Cbr\u003E3.有两个人,轮流取水果,每一次应取走至少一个水果; 每一次只能取走一种水果的一个或者全部\u003Cbr\u003E4.谁取到最后一个水果就胜\u003C\u002Fp\u003E\u003Cp\u003E那好,根据上面的分析, 我们先假设两个人分别为 A 和 B ,A 先取水果,水果的总个数为 M ,即 M = M1 + M2 + M3 + ... + Mn,\u003C\u002Fp\u003E\u003Cp\u003E(1)N = 1(只有一种水果)\u003C\u002Fp\u003E\u003Cp\u003EA 先拿,因为知道水果的种类,所以 A 不需要考虑水果有多少个,他只要第一次拿的时候,拿完这一种水果就可以获胜了。\u003C\u002Fp\u003E\u003Cp\u003E结论:N = 1 ,A 必胜\u003C\u002Fp\u003E\u003Cp\u003E(2)N = 2 (有两种水果)\u003C\u002Fp\u003E\u003Cp\u003E此时两个人都不敢直接拿走一种水果, 因为那样会送对方进入(1)的必胜局中, 自己必败.所以 A 和 B 都只能一个一个的拿, 这样谁拿走最后一个就由 M(水果的总个数) 的奇偶性决定。也就是说 ,M 是奇数,A 必胜,M 是偶数,B 必胜\u003C\u002Fp\u003E\u003Cp\u003E当然我在想这个例子的时候,不小心进入了一个误区,假如第一种水果 3 个,第二种水果 2 个,水果总数为奇数,满足条件,假如 A 先拿第一种水果,B 再拿一个第一种水果,A 再拿一个,然后 B 拿全部第二种,B 赢。可是 A 是足够聪明的,A 拿了第一种水果,B 跟着拿,此时 A 肯定不会接着拿第一种水果的,因为这样自己必败,所以他肯定会选择拿第二种水果,这样就能必胜了。所以还是 N = 2 的时候,水果的总数为奇数,先拿必胜,如果水果的总数为偶数,先拿必败\u003C\u002Fp\u003E\u003Cp\u003E结论:N = 2 ,M 是奇数, A 必胜; 否则 A 必败\u003C\u002Fp\u003E\u003Cp\u003E(3)N = 3 (有三种水果)\u003C\u002Fp\u003E\u003Cp\u003E当水果种类大于 2 种时,不太好确定到底谁获胜,需要根据各种水果数量的奇偶数来判断,因此先按水按数量的奇偶分类,有 4 种可能:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E3 种水果的个数分别都是奇数个\u003C\u002Fli\u003E\u003Cli\u003E3 种水果的个数分别都是偶数个\u003C\u002Fli\u003E\u003Cli\u003E其中 2 种水果的个数是奇数个,其中 1 种水果的个数是偶数个\u003C\u002Fli\u003E\u003Cli\u003E其中 2 种水果的个数是偶数个,其中 1 种水果的个数是奇数个\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E无论上面是哪种情况,A 都可以立即让 B 进入与 (2) 相反的局面(必败的局面),比如:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E3 种水果的个数分别都是奇数个: A 随便拿掉一种水果,剩余的水果总数为偶数(奇数 + 奇数 = 偶数),剩余两种水果,进入了(2)的局面,水果总数为偶数,先拿必败,所以 B 必败,A必胜\u003C\u002Fli\u003E\u003Cli\u003E3 种水果的个数分别都是偶数个: 跟上面是一样的,A 随便拿掉一种水果,剩余的水果总数为偶数(偶数 + 偶数 = 偶数),剩余两种水果,进入了(2)的局面,水果总数为偶数,先拿必败,所以 B 必败,A必胜\u003C\u002Fli\u003E\u003Cli\u003E其中 2 种水果的个数是奇数个,其中 1 种水果的个数是偶数个: A 拿走偶数个的水果的全部,也会进入(2)的局面且水果总数为偶数,A 必胜\u003C\u002Fli\u003E\u003Cli\u003E其中 2 种水果的个数是偶数个,其中 1 种水果的个数是奇数个: A 拿走奇数个的水果的全部,也会进入(2)的局面且水果总数为偶数,A 必胜\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E结论:N = 3 ,A 必胜\u003C\u002Fp\u003E\u003Cp\u003E(4)N = 4 (有四种水果)\u003C\u002Fp\u003E\u003Cp\u003EA 先取, 他肯定不会全部取走一种, 因为会送 B 进入(3)的必胜态, A 就必败.\u003C\u002Fp\u003E\u003Cp\u003E因此 A 只能取一个\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E若 A 取走一个,变成了三种水果,就是变成 (3) 了, 说明 4 种水果都只有一个(否则 A 足够聪明,可以避免这种情况) 即 M 为偶数 4 , A 必败\u003C\u002Fli\u003E\u003Cli\u003E若 A 取完这一个还剩 4 种水果, 那 B 同上分析也只敢取一个,依次类推, 谁最后面对变成 (3) 的情况就必败了.\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E也就是说 M - 4 必须是奇数,这样 A 才会让 B 进入最终的必败局面,所以胜负由 M - 4 的奇偶性决定, 也就是说胜负由 M 的奇偶性决定\u003C\u002Fp\u003E\u003Cp\u003E结论:N = 4 ,M 是奇数, A 必胜; 否则 A 必败\u003C\u002Fp\u003E\u003Cp\u003E通过上面的递推,我们基本可以看到规律了:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003EN 为奇数,A 必胜\u003C\u002Fli\u003E\u003Cli\u003EN 为偶数,如果 M 为奇数,A 必胜;如果 M 为偶数,A 必败\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ch1\u003E三、编程\u003C\u002Fh1\u003E\u003Cp\u003E最后我们通过编程解决 GitHub 地址:\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002FTwoWater\u002FInterview\u002Fblob\u002Fmaster\u002FInterview\u002Fsrc\u002Fcom\u002Fliangdianshui\u002FTakeTheFruit.java\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\u003Egithub.com\u002FTwoWater\u002FInt\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Eerview\u002Fblob\u002Fmaster\u002FInterview\u002Fsrc\u002Fcom\u002Fliangdianshui\u002FTakeTheFruit.java\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Epackage com.\n\nimport java.util.S\n\n\u002F**\n * &p&\n *
有任意种水果,每种水果个数也是任意的,两人轮流从中取出水果,规则如下:\n *
1)每一次应取走至少一个水果;每一次只能取走一种水果的一个或者全部\n *
2)如果谁取到最后一个水果就胜\n *
给定水果种类N和每种水果的个数M1,M2,…Mn,算出谁取胜。\n *
(题目的隐含条件是两个人足够聪明,聪明到为了取胜尽可能利用规则)\n * &\u002Fp&\n * \n * @author liangdianshui\n *\n *\u002F\npublic class TakeTheFruit {\n
private static final String EXIT = \&q\&;\n\n
public static void main(String[] args) throws Exception {\n
Scanner scanner = new Scanner(System.in);\n
int[] fruitN\n\n
System.out.println(\&假设 A 和 B 两个人,A 先取水果\&);\n
System.out.println(\&请输入每种水果的个数(空格或回车分隔):\&);\n
System.out.println(\&输入 Q 或
q 退出\&);\n\n
if (EXIT.equalsIgnoreCase(input = scanner.nextLine())) {\n
System.out.println(\&Exit\&);\n \n
input = input.trim();\n
if (input.length() != 0) {\n
fruitNums = initFruitNums(input);\n
boolean isWin = takeTheFruitGame(fruitNums, fruitNums.length);\n
if(isWin){\n
System.out.println(\&A 赢\&);\n
System.out.println(\&B 赢\&);\n
System.out.println(\&--------------------------------------------\&);\n
} while (true);\n
\u002F**\n
* 初始化每种水果的个数\n
* @param input\n
* @return\n
private static int[] initFruitNums(String input) {\n
String[] nums = input.split(\&\\\\s+\&);\n
int[] fruitNums = new int[nums.length];\\n
for (int i = 0; i & nums. i++) {\n
num = Integer.parseInt(nums[i]);\n
if (num &= 0) {\n
throw new IllegalArgumentException(\&水果数量不能为 0 或负数:\& + num);\n
fruitNums[i] =\n
return fruitN\n
\u002F**\n
* 递归法\n
* @param fruitNums\n
* @param numOfTypes\n
* @return\n
private static boolean takeTheFruitGame(int[] fruitNums, int numOfTypes) {\n\n
\u002F\u002F当水果种类为1的时候,必胜\n
if (numOfTypes == 1) {\n
\u002F\u002F 当水果种类为2的时候\n
if (numOfTypes == 2) {\n
return sumOfTwoFruitNums(fruitNums) % 2 == 1;\n
\u002F\u002F 当水果种类大于等于3的时候\\n
for (int i = 0; i & fruitNums. i++) {\n
num = fruitNums[i];\n
if (num == 0)\n
fruitNums[i] = 0;\n
if (!takeTheFruitGame(fruitNums, numOfTypes - 1)) {\n
fruitNums[i] =\n
if (num & 1) {\n
fruitNums[i] = num - 1;\n
if (!takeTheFruitGame(fruitNums, numOfTypes)) {\n
fruitNums[i] =\n
fruitNums[i] =\n
\u002F**\n
通过结论直接输出结果\n
N 为奇数,A 必胜\n
N 为偶数,如果 M 为奇数,A 必胜;如果 M 为偶数,A 必败\n
* &\u002Fp&\n
* @param fruitNums\n
* @return\n
private static boolean takeTheFruitGame2(int[] fruitNums) {\n
if (fruitNums.length % 2 == 1) {\n
return sumOfFruitNums(fruitNums) % 2 == 1;\n
private static int sumOfTwoFruitNums(int[] fruitNums) {\n
int num1 = 0;\n
int num2 = 0;\n\n
for (int num : fruitNums) {\n
if (num & 0) {\n
if (num1 == 0) {\n
} else {\n
return num1 + num2;\n
private static int sumOfFruitNums(int[] fruitNums) {\n
int sum = 0;\n\n
for (int num : fruitNums) {\n
}\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T19:33:24+08:00&,&url&:&\u002Fp\u002F&,&title&:&2014新浪校招笔试题:取水果(17年第一篇让人懵逼的面试题)&,&summary&:&前言2017 年,我还是会坚持每周一篇面试题,当然我每周看的面试题肯定是不止一篇的,我是在这周看过的面试题中,选择一题自己认为较好的来写。因为每一篇都写,不现实,写一篇博客,需要的时间也是挺长的,所以选择较好较大众化的题目。一、题目有任意种水…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:0,&likesCount&:2},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002F50\u002Fv2-60f0dae96ef42b8f4c7dbbe6e12483c4_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&Android 开发&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&程序员&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&求职BAT&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&微信公众号:ReadingWithU&,&isFollowing&:false,&hash&:&58f7aade3c0e&,&uid&:951900,&isOrg&:false,&slug&:&liangdianshui&,&isFollowed&:false,&description&:&水天水地水自己&,&name&:&两点水&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fliangdianshui&,&avatar&:{&id&:&v2-b0c28edf16b652af5641197f&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&twowater&,&name&:&【水面试题】&},&content&:&\u003Cblockquote\u003E\u003Cp\u003E最近又想搞即时通讯又想搞网络框架,然而都没弄出来,博客也有几天没有更新了,不过每周面试题还是得照常继续的。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch1\u003E一、题目\u003C\u002Fh1\u003E\u003Cblockquote\u003E\u003Cp\u003E2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3的倍数的开关按一次,以此类推,最后把2015的倍数灯的开关按一次。问最后亮着的灯有多少盏?\u003C\u002Fp\u003E\u003Cp\u003EA. 43\u003Cbr\u003EB. 44\u003Cbr\u003EC. 45\u003Cbr\u003ED. 46\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Ch1\u003E二、解题\u003C\u002Fh1\u003E\u003Cblockquote\u003E\u003Cp\u003E咋一看,这不是数学问题吗?干脆用数学解了。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E先来分析一下,因为一开始的时候 2015 盏灯都是熄灭的,按一次灯就开了, 按两次灯就熄灭了,由此可以知道只有按过奇数次的灯才可能是亮着的,题目中还有一个信息,就是把 1 的倍数的灯按一次,把 2 倍数的灯按一次,把 3 倍数的灯按一次,如此类推,这不就是求每个数的公约数吗?因此结合第一第二个条件,我们就可以把题目演化成求1-2015中有哪些数的公约数是奇数个的。如:1 , 4, 9 , 16..... (注:一个数的约数必然包括1及其本身) 这样算还是比较麻烦,我们可以继续把题目演化,求哪些数的公约数是奇数个其实也就是求哪些数是平方数,为什么呢?因为约数都是成对出现的,平方数是由两个相同的约数得到的,但是算个数是只算一个。偶数加奇数是奇数。所以只有平方数才有奇数个约数。最后,问题就变得很简单了,其实就是求1-2015中有多少个平方数,换个角度就是:44^2&,最后的答案就是 44 个,选 B\u003C\u002Fp\u003E\u003Cp\u003E其实这道题也就是leetcode原题 【\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fleetcode.com\u002Fproblems\u002Fbulb-switcher\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E319. Bulb Switcher\u003C\u002Fa\u003E】,其实看看我以往发的面试题可以知道,大公司的面试题基本都是算法题,而且都是根据一些经典的算法题更改或原封不动地出的。\u003C\u002Fp\u003E\u003Cp\u003E最后用 java 来解一下,其实就是一句话的问题。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\u002Fpic4.zhimg.com\u002Fv2-f6cd275b4f_b.png\& data-rawwidth=\&679\& data-rawheight=\&534\& class=\&origin_image zh-lightbox-thumb\& width=\&679\& data-original=\&http:\u002F\u002Fpic4.zhimg.com\u002Fv2-f6cd275b4f_r.png\&\u003E\u003C\u002Ffigure\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T19:33:41+08:00&,&url&:&\u002Fp\u002F&,&title&:&2016滴滴出行研发工程师笔试题(亮灯问题)&,&summary&:&最近又想搞即时通讯又想搞网络框架,然而都没弄出来,博客也有几天没有更新了,不过每周面试题还是得照常继续的。一、题目2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:0,&likesCount&:0}},&annotationDetail&:null,&commentsCount&:4,&likesCount&:9,&FULLINFO&:true}},&User&:{&liangdianshui&:{&isFollowed&:false,&name&:&两点水&,&headline&:&水天水地水自己&,&avatarUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-b0c28edf16b652af5641197f_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&liangdianshui&,&bio&:&微信公众号:ReadingWithU&,&hash&:&58f7aade3c0e&,&uid&:951900,&isOrg&:false,&description&:&水天水地水自己&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fliangdianshui&,&avatar&:{&id&:&v2-b0c28edf16b652af5641197f&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&androidPassThroughPush&:&all&,&sEI&:&c&,&nwebQAGrowth&:&experiment&,&qawebRelatedReadingsContentControl&:&close&,&liveStore&:&ls_a2_b2_c1_f2&,&nwebSearch&:&nweb_search_heifetz&,&rt&:&y&,&showVideoUploadAttention&:&true&,&isOffice&:&false&,&enableTtsPlay&:&post&,&newLiveFeedMediacard&:&new&,&newMobileAppHeader&:&true&,&hybridZhmoreVideo&:&yes&,&nwebGrowthPeople&:&default&,&nwebSearchSuggest&:&default&,&qrcodeLogin&:&qrcode&,&enableVoteDownReasonMenu&:&enable&,&isf8&:&0&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&androidDbRecommendAction&:&open&,&zcmLighting&:&zcm&,&androidDbFeedHashTagStyle&:&button&,&appStoreRateDialog&:&close&,&default&:&None&,&isNewNotiPanel&:&no&,&adR&:&b&,&wechatShareModal&:&wechat_share_modal_show&,&growthBanner&:&default&,&androidProfilePanel&:&panel_b&}},&columns&:{&next&:{},&twowater&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Ftwowater&,&name&:&【水面试题】&,&creator&:{&slug&:&liangdianshui&},&url&:&\u002Ftwowater&,&slug&:&twowater&,&avatar&:{&id&:&v2-faa3b1e995b07e8c9a12d7b78c7ef8ed&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&switches&:{&couldSetPoster&:false},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{&baidu&:false,&yidianzixun&:false,&qqnews&:false},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false,&userAgent&:{&ua&:&Mozilla\u002F5.0 (compatible, MSIE 11, Windows NT 6.3; Trident\u002F7.0; rv:11.0) like Gecko&,&browser&:{&name&:&IE&,&version&:&11&,&major&:&11&},&engine&:{&version&:&7.0&,&name&:&Trident&},&os&:{&name&:&Windows&,&version&:&8.1&},&device&:{},&cpu&:{}}},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}

我要回帖

更多关于 华为硬件工程师笔试题 的文章

 

随机推荐