申明:这是在看到园子里两个帖子关于两道面试编程题之后个人的一点想法

面试题一:

大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
第一次,将所有的灯点亮。
第二次,将所有2的倍数的开关按一下。
第三次,将所有3的倍数的开关按一下。
以此类推。第N次,将所有N的倍数的开关按一下。
问第100次按完以后,大厅里还有几盏灯是亮的。

看到这道题后我马上想怎样编程去实现这个问题

这道题不复杂很快我就想到一个实现的办法,首先我写了一个winform程序,界面用来展示各个灯最后的状态

第一版的代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

private void Form1_Load(object sender, EventArgs e)

{

    //灯的集合 Dictionary<灯的序号,灯的状态(0:灭,1:亮)>

    Dictionary<int, int> dicLight = new Dictionary<int,int>();

    //添加100盏灯

    for (int i = 1; i <= 100; i++)

        dicLight.Add(i, 0);

    //100次对灯的操作

    for (int i = 1; i <= 100; i++)

    {

        if (i == 0)

            //把全部灯点亮

            for (int j = 1; j <= 100; j++)

                dicLight[j] = 1;

        else

            for (int k = 1; k <= 100; k++)

                if (k % i == 0)

                    dicLight[k] = dicLight[k] == 1 ? 0 : 1;

    }

    //循环所有灯并在界面上展示

    foreach (KeyValuePair<int, int> param in dicLight)

        txtLightStates.Text += "第" + param.Key + "盏灯状态为:" + (param.Value == 0 ? "灭" : "亮")+"\r\n";

}

以下是运行结果

所以这就完了? 当然不是,然后我想到如果灯的数量跟要操作的次数是可变的呢,然后我开始重构这个方法,把可变的参数提取出来作为方法参数

修改后的代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

private void Form1_Load(object sender, EventArgs e)

   {

   }

   public Dictionary<int, int> ChangeLightState(int lightNum, int changeLightNum)

   {

       //灯的集合 Dictionary<灯的序号,灯的状态(0:灭,1:亮)>

       Dictionary<int, int> dicLight = new Dictionary<int, int>();

       //添加N盏灯

       for (int i = 1; i <= lightNum; i++)

           dicLight.Add(i, 0);

       //N次灯的操作

       for (int i = 1; i <= changeLightNum; i++)

       {

           if (i == 1)

               //把全部灯点亮

               for (int j = 1; j <= lightNum; j++)

                   dicLight[j] = 1;

           else

               for (int k = 1; k <= lightNum; k++)

                   if (k % i == 0)

                       dicLight[k] = dicLight[k] == 1 ? 0 : 1;

       }

       return dicLight;

   }

   private void btnStartCal_Click(object sender, EventArgs e)

   {

       int lightNum=0,changeLightNum=0;

       int.TryParse(txtLightNum.Text,out lightNum);

       int.TryParse(txtChangeLightNum.Text,out changeLightNum);

       Dictionary<int, int> dicLight = ChangeLightState(lightNum, changeLightNum);

       //循环所有灯并在界面上展示

       foreach (KeyValuePair<int, int> param in dicLight)

           txtLightStates.Text += "第" + param.Key + "盏灯状态为:" + (param.Value == 0 ? "灭" : "亮") + "\r\n";

   }

下面是运行界面跟结果

看过《大话设计模式》的同学都知道到这里肯定没完,比果我要实现2的倍数亮,3的倍数不亮怎么办呢?

下面的留给各位自己想象去吧

作者:二本二

来源:51CTO

一道面试题引发的关于程序设计的想法相关推荐

  1. java yang模型_一道面试题引发的对Java内存模型的一点疑问

    一道面试题引发的对Java内存模型的一点疑问 问题描述如上图所示程序,按道理,子线程会通过 num++ 操作破坏 while 循环的条件,从而终止循环,执行最后的输出操作.但在我的多次运行中,偶尔会出 ...

  2. 一道笔试题引发的Promise笔记

    前言 近来参加校招笔试,发现有好几道关于Promise的题目.然而我都没有了解过.所以,这篇文章以网易笔试的一道题开始,记录关于Promise的那些事. 文章地址:http://lsxj615.com ...

  3. 一道面试题引发的“血案”

    2019独角兽企业重金招聘Python工程师标准>>> 前言 es6之前,js的作用域只有两种,全局作用域和函数作用域,没有像C和java那样的块级作用域,于是对于学了C或者java ...

  4. 一道面试题引发的对JavaScript类型转换的思考

    最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 ...

  5. 一道HashSet面试题引发的蝴蝶效应

    没错,我又借着"面试题"的名头来搞事情了,今天要说的是 HashSet ,而这确实是一个实际面试中遇到的问题.当时的场景大概是这样的,面试官在了解了你的知识广度以后,决心来考察一番 ...

  6. 从一道面试题,到“我可能看了假源码[2]

    上一篇从一道面试题,到"我可能看了假源码"中,由浅入深介绍了关于一篇经典面试题的解法. 最后在皆大欢喜的结尾中,突生变化,悬念又起.这一篇,就是为了解开这个悬念. 如果你还没有看过 ...

  7. 一道面试题:猫大叫了一声...

    今天在博客园上看到一道面试题,是关于委托和事件的,为了重温事件的应用,自己又做了一遍. 题目:  程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒.(C#语言) 要求:  1.要有联动性,老鼠 ...

  8. 「一道面试题」输入URL到渲染全面梳理中-页面渲染篇

    前置知识 此文是一道面试题,又不仅仅是一道面试题,不过这道题共分了三篇来说,嗯..可想而知 接上文,上文我们讲了网络通信的部分,详细请看「一道面试题」输入URL到渲染全面梳理上-网络通信篇, 那么该说 ...

  9. 从一道面试题谈谈一线大厂码农应该具备的基本能力

    作者:Yura Shevchenko 来源:skypixel.com 关于一线码农的面试,我想说 求职面试在绝大部分人来说都是必不可少的,自己作为求职者也参与了不少面试(无论成功或者失败),作为技术面 ...

最新文章

  1. 如何关闭360自定义错误页面
  2. 凸优化中如何改进GD方法以防止陷入局部最优解
  3. 有三AI小程序上线,把你的代码show给世界
  4. java 文件上传ssm_ssm框架下实现文件上传
  5. 使用计算机管理文件教后反思,《管理计算机中的文件》教学反思
  6. LeetCode 916. 单词子集(计数)
  7. java useragent 360 遨游 火狐_各种浏览器UserAgent一览表(桌面+移动)
  8. hive学习08天-一次hvie面试题
  9. Linux | Ubuntu:十年,十个关键时刻
  10. P06: 分组的背包问题
  11. electron 打开调试_构建基于 iOS 模拟器的前端调试方案
  12. Android - 模块添加与编译
  13. 封面型网页html,网站设计常用网页版式
  14. 为什么要制定项目计划?
  15. 最新SOCKS5代理服务器 socks5代理ip地址
  16. 山东春考计算机组装与维修,山东春考计算机组装与维修模拟试题(11页)-原创力文档...
  17. Ceph 命令 pool image 纠删
  18. 胖大海和罗汉果可以同泡吗
  19. 已解决vue-router4路由报“[Vue Router warn]: No match found for location with path“
  20. 基于微信小程序java音乐播放器毕业设计论文/程序代码

热门文章

  1. java 容器 线程_JAVA多线程并发容器
  2. python编程爱因斯坦的问题_教你如何用编程解决爱因斯坦的数学问题
  3. C#学习Error问题:“System.NullReferenceException:未将对象引用设置到对象的实例”
  4. 裸辞,迎接2019年的春天
  5. 携手长江天成转型 谋定·农业大健康-林裕豪:升级山茶油农产品
  6. 广州谋定营养功能性早餐-丰收节交易会·李喜贵:系统工程
  7. 联合国和平音乐会主题粮安天下 国际农民丰收节贸易会贺电
  8. 洛谷P4136 谁能赢呢?——博弈
  9. jdk7启动时报“java.lang.VerifyError:Expecting a stackmap frame at branch target”
  10. [bzoj1088]扫雷