學會用另一種途徑去解決程式設計問題

2022-08-27 20:21:10 字數 1911 閱讀 3043

題目描述:

依序遍歷0到100閉區間內所有的正整數,如果該數字能被3整除,則輸出該數字及『*』標記;如果該數字能被5整除,則輸出該數字及『#』標記;如果該數字既能被3整除又能被5整除,則輸出該數字及『*#』標記。

這道看似非常簡單的題目,卻潛藏著幾個玄機。面試官通過這道題,考察學生在語法、語義、語用以及演算法優化方面的能力。現實告訴我們,通過這一道題目,就可以淘汰85%的面試者。看似殘酷的考察方式,卻也體現出學生在基礎知識、動手能力到思維能力上的差距。

需要注意的考察點:

- 語法:語法的正確書寫,包括格式

- 語義:對迴圈、分支等語義的理解與掌握

- 語用:對變數命名、表示式及語句的組合使用

- 演算法優化:如果要提高執行效率,可以在演算法上尋找突破口,也可以採用空間換時間的通用原則。

當自己看到題目的一瞬間腦海中就閃現出:for迴圈遍歷,然後if判斷,後來仔細一想,這也太簡單了,肯定有坑。然後看到討論中貼上的錯誤**:

public

void

foo()

else

if (i % 5 == 0)

else

if (i % 3 == 0 && i % 5 == 0) }}

view code

此處的錯誤就不多說了,缺少了3和5都能整除的那部分。自己思索以後,發現用for迴圈很顯然次數過多,效率低下,於是便思考如何能減少迴圈次數。當自己再次看題目時,覺得自己被題目的第一句話「依序遍歷0到100閉區間內所有的正整數」,所蒙蔽了,其實題目就是想求,在[1,100]中的3、5、15的倍數。於是茅塞頓開,其實何必for迴圈100次呢?

public

void

foo()

else

}if (i * 5

<= 100

) }}

}

view code

2、求以下表示式的值,寫出您想到的一種或幾種實現方法: 1-2+3-4+……+m

要求就是這麼簡單,可能好多人一看到又會開始for迴圈,if判斷,如:

int num =100 ;       //

加到第100個數

int sum = 0

;

for (int i = 0 ; i < num + 1 ; i++)

else

}system.console.writeline(sum.tostring());

system.console.readline() ;

view code

殊不知其實我們小學就學過它的解法.

int num = 100;          //

加到第100個數

console.writeline(math.pow(-1, num + 1) * ((num + 1) / 2)); //

-1的num+1次冪乘以 num+1整除2得到的結果

view code

這個例子同樣簡單,只為了說明在我們程式設計過程中,要盡量學會用數學的思維去進行解決問題,有時候會有意料之外的收穫。

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 的正...