一道面试题引发的关于程序设计的想法
申明:這是在看到園子里兩個帖子關于兩道面試編程題之后個人的一點想法
面試題一:
大廳里有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
總結
以上是生活随笔為你收集整理的一道面试题引发的关于程序设计的想法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “智网络 · 汇安全”绿盟科技智慧安全2
- 下一篇: 如何在Github打造你的爆款开源项目