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

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

面试题一:

大厅里有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

时间: 2024-10-21 11:11:43

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

一道面试题引发的对javascript类型转换的思考

最近群里有人发了下面这题:实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 对于一个好奇的切图仔来说,忍不住动手尝试了一下,看到题目首先想到的是会用到高阶函数以及 Array.prototype.reduce(). 高阶函数(Higher-order function):高阶函数的意思是它接收另一个函数作为参数.在 javascript 中,函数是一等公民,允许函数作为参数或

一道面试题(关于千万量级数据结构排序)

问题描述 一道面试题(关于千万量级数据结构排序) 题目: 已知文件中存有全国英语六级历年来的成绩(千万级别,考生分数都是正整数,最高710分),每一行都是一个人的姓名.考号和成绩,请你对考生的成绩从高到低进行排序,输出到另一个文件中. 格式 如下: 李四,201008823,678: 张三,201007432,356: 王五,201322233,464: 排序后: 李四,201008823,678: 王五,201322233,464: 王五,201322233,464: 要求:使空间复杂度和时间

语言 面试题-一道面试题,不是很清楚这个例子怎么解答,求大神帮助.

问题描述 一道面试题,不是很清楚这个例子怎么解答,求大神帮助. 提问是 这段代码有什么问题, 有什么解决思路.(我其实连问题都没看出来,代码可以编译) // Memory-mapped peripheral#define STATUS_REG_ADDR 0x12345678 // 32-bit status register#define DATA_REG_ADDR 0x1234567C // 32-bit data register // Status register bits#define

初始化顺序-今年阿里巴巴的一道笔试题

问题描述 今年阿里巴巴的一道笔试题 public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

结构体定义-如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题。

问题描述 如何定义满足以下的Node与List结构体,今天参加斐讯的一道笔试题. Node包含50个字符.

从一道面试题说去

    有一道面试题: 给定n个整型数,怎样让这n个数的使用空间最小.      ok,我们都知道在32位的机器下,int类型的数占4个字节,因此n个数总的使用空间应该是4n.(64位不做解释)那我们怎么样才能使得n个数字的使用空间最小呢?     一. 我们先来看一个例子           假设现在有3个数,1,2,3.           我们都知道数字最后都是以二进制的方式存储的,我们可以表示出1,2,3的二进制           1: 0000 0000 0000 0000 0000

《Wireshark网络分析就这么简单》—从一道面试题开始说起

从一道面试题开始说起Wireshark网络分析就这么简单从一道面试题开始说起我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精

《大咖讲Wireshark网络分析》—从一道面试题开始说起

从一道面试题开始说起大咖讲Wireshark网络分析我每次当面试官,都要伪装成无所不知的大牛. 这当然是无奈的选择--现在每封简历都那么耀眼,不装一下简直镇不住场面.比如尚未毕业的本科生,早就拿下CCIE认证:留欧两年的海归,已然精通英.法.德三门外语:最厉害的一位应聘者,研究生阶段就在国际上首次提出了计算机和生物学的跨界理论--可怜我这个老实人在一开场还能装装,到了技术环节就忍不住提问基础知识,一下子把气氛从学术殿堂拉到建筑工地.不过就是这些最基础的问题,却常常把简历精英们难住.本文要介绍的便

一道面试题:布尔变量

FROM:酷壳 下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:"如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true",于是LZ做了下面的这样的程序: boolean atLeastTwo(boolean a, boolean b, boolean c) { if ((a && b) || (b && c) || (a && c)) { return true; } else { r