前幾天因為面試關係,寄來附上筆試連結,內有個深思一題。
面試公司大概是想要視窗(Windows Form)的回答,不過由於電腦不給力無法安裝,於是自己練習網頁(Web Form)。 <<直接放棄面試
題目是"30秒內10萬顆樂透開球"!
這家德X公司本來就搞金融相關產品,所以出要效率的程式不會很意外,只是我先偷偷罵圈叉一下。XD
因為C#是在專科二年級學的,而且專題也沒用,幾乎快白紙一張。
話不多說,開始程式話題。XDDD
首先在頁面放個按鈕加上標籤顯示掛著。
<div>
<asp:Button ID="Button1" runat="server" Text="樂透開球" OnClick="Button1_Click"/><br/><br/><br/>
<asp:Label ID="lbl_show" runat="server" Text="等待中"></asp:Label>
</div>
然後根據爬文C#規則後,寫出開球程式。
public partial class _Default : System.Web.UI.Page
{
int out_ball = 70000; //5W球55秒,7W球114秒,10W球464秒網頁GG
int min_ball = 1;
int max_ball = 100001;
int[] cha_arr;
int temp;
String show_temp = "";
Random output_ball = new Random();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
lbl_show.Text = "";
cha_arr=new int[out_ball];
for (int i = 0; i < cha_arr.Length; i++)
{
cha_arr[i] = wash(i);
show_temp += cha_arr[i].ToString()+" / ";
}
lbl_show.Text = show_temp;
}
public int wash(int out_i)
{
temp = output_ball.Next(min_ball, max_ball);
for(int j=0;j<out_i;j++)
{
if (cha_arr[j] == temp)
{
wash(out_i);
}
}
return temp;
}
}
簡單流程如下:
當我按下按鈕後,標籤先清空,陣列長度設為球數。
用for迴圈繞輸出球數,中間呼叫wash(),跳到wash()小天地。
一開始告訴output_ball亂數範圍,接著他會洗出一個數。
再用for迴圈中if判斷洗出數與儲存cha_arr是否一樣,一樣的話又叫wash()。 <<就是江湖人稱遞迴
如果沒有又叫wash(),要return給cha_arr存入,利用show_temp字串相加加長,最終lbl_show顯示超長的show_temp。
效率如何:
其實是?
為何會這樣,問題出在
temp = output_ball.Next(min_ball, max_ball);
這段是在一段範圍隨意丟出一個數,他不在意你上一次丟啥數,讀到if判斷發現一樣繼續叫wash()!
所以會造成可能繞10W次,不,超過10W次都有可能,薪水也沒那麼多! <<太慘了
為了解決問題,於今日想出很菜鳥方法,但有"真正"提高效率!
頁面如上方同樣,不過程式要稍微改變一下方法。
public partial class Default3 : System.Web.UI.Page
{
int out_ball = 100000; //5W球32秒,7W球61秒,10W球125秒
int min_ball = 1;
int max_ball = 100000;
int[] cha_arr;
int temp;
int cha_len;
String show_temp = "";
Random output_ball = new Random();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
lbl_show.Text = "";
cha_len = max_ball;
cha_arr = new int[cha_len];
//生數字存陣列
for (int i = 0; i < max_ball; i++)
{
cha_arr[i] = i + min_ball;
}
//開始撈球
for (int j = 0; j < out_ball; j++)
{
temp = output_ball.Next(0, cha_len-1);
show_temp += cha_arr[temp].ToString() + " / ";
cha_arr[temp]=cha_arr[cha_len - 1];
cha_len -= 1;
}
lbl_show.Text = show_temp;
}
}
簡單流程如下:
當我按下按鈕後,標籤先清空,陣列長度預設為最大數。
用for迴圈把每顆樂透球存入陣列。
又再用for迴圈,利用output_ball洗出一個亂數,亂數範圍為陣列長度。
洗出一個數當成陣列編號把存入的數撈出,並且把陣列尾數編號的內容存入被撈出的陣列編號中,把陣列長度減一,最後顯示結果。
效率如何:
根據不才又健忘的小迷,運用數學粗算一下......
如果要10W球出,最高為
10W+10W=20W
難怪10萬球網頁運轉只要125秒