題目描述:
依序遍歷0到100閉區間內所有的正整數,如果該數字能被3整除,則輸出該數字及『*』標記;如果該數字能被5整除,則輸出該數字及『#』標記;如果該數字既能被3整除又能被5整除,則輸出該數字及『*#』標記。
這道看似非常簡單的題目,卻潛藏著幾個玄機。面試官通過這道題,考察學生在語法、語義、語用以及演算法優化方面的能力。現實告訴我們,通過這一道題目,就可以淘汰85%的面試者。看似殘酷的考察方式,卻也體現出學生在基礎知識、動手能力到思維能力上的差距。
需要注意的考察點:
- 語法:語法的正確書寫,包括格式
- 語義:對迴圈、分支等語義的理解與掌握
- 語用:對變數命名、表示式及語句的組合使用
- 演算法優化:如果要提高執行效率,可以在演算法上尋找突破口,也可以採用空間換時間的通用原則。
當自己看到題目的一瞬間腦海中就閃現出:for迴圈遍歷,然後if判斷,後來仔細一想,這也太簡單了,肯定有坑。然後看到討論中貼上的錯誤**:
publicview codevoid
foo()
else
if (i % 5 == 0)
else
if (i % 3 == 0 && i % 5 == 0) }}
此處的錯誤就不多說了,缺少了3和5都能整除的那部分。自己思索以後,發現用for迴圈很顯然次數過多,效率低下,於是便思考如何能減少迴圈次數。當自己再次看題目時,覺得自己被題目的第一句話「依序遍歷0到100閉區間內所有的正整數」,所蒙蔽了,其實題目就是想求,在[1,100]中的3、5、15的倍數。於是茅塞頓開,其實何必for迴圈100次呢?
publicview codevoid
foo()
else
}if (i * 5
<= 100
) }}
}
2、求以下表示式的值,寫出您想到的一種或幾種實現方法: 1-2+3-4+……+m
要求就是這麼簡單,可能好多人一看到又會開始for迴圈,if判斷,如:
int num =100 ; //view code加到第100個數
int sum = 0
;
for (int i = 0 ; i < num + 1 ; i++)
else
}system.console.writeline(sum.tostring());
system.console.readline() ;
殊不知其實我們小學就學過它的解法.
int num = 100; //view code加到第100個數
console.writeline(math.pow(-1, num + 1) * ((num + 1) / 2)); //
-1的num+1次冪乘以 num+1整除2得到的結果
這個例子同樣簡單,只為了說明在我們程式設計過程中,要盡量學會用數學的思維去進行解決問題,有時候會有意料之外的收穫。
3.編寫乙個陣列,長度為100, 然後插入[1,100]的數字 不能重複
看到題目可能會想到的是2個for迴圈然後插入資料,或是用[1,100]的隨機數插入,其實最好的方法是用洗牌演算法來實現。網上關於這方面的也很多,我就不班門弄斧了。
洗牌程式的兩種實現方法比較
這篇文章裡面講述的這些都是一些面試題,也許比較簡單,而本文章說些的這些方法也只是眾多方法中的乙個,本文的目的在於提醒自己在程式設計的過程中需要注意的東西,努力多去思考,不要拘泥於一兩種方法,努力開拓自己的思維,有時候換另一種方法/途徑或是可以做得更好。
另一種階乘問題
大家都知道階乘這個概念,舉個簡單的例子 5!1 2 3 4 5.現在我們引入一種新的階乘概念,將原來的每個數相乘變為i不大於n的所有奇數相乘例如 5 1 3 5.現在明白現在這種階乘的意思了吧!現在你的任務是求出1 2 n 的正確值 n 20 輸入 第一行輸入乙個a a 20 代表共有a組測試資料 ...
另一種階乘問題
描述 大家都知道階乘這個概念,舉個簡單的例子 5!1 2 3 4 5.現在我們引入一種新的階乘概念,將原來的每個數相乘變為i不大於n的所有奇數相乘例如 5 1 3 5.現在明白現在這種階乘的意思了吧!現在你的任務是求出1 2 n 的正確值 n 20 輸入 第一行輸入乙個a a 20 代表共有a組測試...
另一種階乘問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 大家都知道階乘這個概念,舉個簡單的例子 5!1 2 3 4 5.現在我們引入一種新的階乘概念,將原來的每個數相乘變為i不大於n的所有奇數相乘例如 5 1 3 5.現在明白現在這種階乘的意思了吧!現在你的任務是求出1 2 n 的正...