前幾天因為面試關係,寄來附上筆試連結,內有個深思一題。

面試公司大概是想要視窗(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秒

創作者介紹
創作者 o迷苓o 的頭像
o迷苓o

~米漿牛奶~

o迷苓o 發表在 痞客邦 留言(0) 人氣()