- 相關推薦
一道面試題引發(fā)的關于程序設計的想法
申明:這是在看到園子里兩個帖子關于兩道面試編程題之后個人的一點想法
面試題一:
大廳里有100盞燈,每盞燈都編了號碼,分別為1-100。每盞燈由一個開關來控制。(開關按一下,燈亮,再按一下燈滅。開關的編號與被控制的燈相同。)開始時,燈是全滅的,F在按照以下規(guī)則按動開關。
第一次,將所有的燈點亮。
第二次,將所有2的倍數的開關按一下。
第三次,將所有3的倍數的開關按一下。
以此類推。第N次,將所有N的倍數的開關按一下。
問第100次按完以后,大廳里還有幾盞燈是亮的。
看到這道題后我馬上想怎樣編程去實現這個問題
這道題不復雜很快我就想到一個實現的辦法,首先我寫了一個winform程序,界面用來展示各個燈最后的狀態(tài)
第一版的代碼如下
private void Form1_Load(object sender, EventArgs e)
{
//燈的集合 Dictionary<燈的序號,燈的狀態(tài)(0:滅,1:亮)>
Dictionary dicLight = new Dictionary();
//添加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;
}
//循環(huán)所有燈并在界面上展示
foreach (KeyValuePair param in dicLight)
txtLightStates.Text += "第" + param.Key + "盞燈狀態(tài)為:" + (param.Value == 0 ?"滅" : "亮")+"\r\n";
}
以下是運行結果
所以這就完了? 當然不是,然后我想到如果燈的數量跟要操作的次數是可變的呢,然后我開始重構這個方法,把可變的參數提取出來作為方法參數
修改后的代碼如下
private void Form1_Load(object sender, EventArgs e)
{
}
public Dictionary ChangeLightState(int lightNum, int changeLightNum)
{
//燈的集合 Dictionary<燈的序號,燈的狀態(tài)(0:滅,1:亮)>
Dictionary dicLight = new Dictionary();
//添加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 dicLight = ChangeLightState(lightNum, changeLightNum);
//循環(huán)所有燈并在界面上展示
foreach (KeyValuePair param in dicLight)
txtLightStates.Text += "第" + param.Key + "盞燈狀態(tài)為:" + (param.Value == 0 ? "滅" : "亮") + "\r\n";
}
下面是運行界面跟結果
看過《大話設計模式》的同學都知道到這里肯定沒完,比果我要實現2的倍數亮,3的倍數不亮怎么辦呢?
下面的留給各位自己想象去吧
【一道面試題引發(fā)的程序設計的想法】相關文章:
擁抱引發(fā)的職場危機08-02
程序設計心得04-26
這是一道阿里巴巴的面試題,難倒了95%的面試者,你ok嗎?07-31
引發(fā)共鳴的演講法則02-11
補強型收購引發(fā)的麻煩07-19
硅谷面試題精選02-03
電信面試題07-20
Java經典面試題12-29
Cisco的面試題09-25