去年2月份的時候剛來深圳,在第一家公司面試,也是我如今所在的公司.當時主管給我作了一套筆試題,結果不是很理想,當時我還特地寫了篇博文:求職路 第二章 技術篇html
被錄用以後,我找主管要了一份當時的筆試題,又從新作了次.昨天偶然發現了這張試題,算是對本身的一個回顧.面試
主要是2道算法題和1道sql題,當時確實很菜,算法題有錯誤,而sql全掛,也感謝老大把這麼菜的我招到麾下,讓我磨練至今.固然如今個人sql依然很菜,確實不太有興趣研究數據庫.算法
算法題1:以C#或JavaScript語言實現一個鬥地主的發牌算法.(都地主發牌規則:共54張牌,3人打,沒人發17張,剩餘3張.)sql
PS:其實我之前沒玩過鬥地主,後來才知道怎麼玩.固然仍是不怎麼喜歡玩:)數據庫
我理解這個題,就是把54張牌先預製好,而後打亂順序,依次發給3個玩家.最核心的應該是洗牌的算法.個人思路是:數組
1.生成一個長度爲54的數組.爲數組賦上初值1~54.dom
2.在1~54中生成一個隨機數.spa
3.把這個數的位置與數組最後一位交換.code
4.依次遞減數組長度.直到長度爲0.htm
static void Shuffle(int[] cards) { int length = cards.Length-1; int index = length; Random r = new Random(); while(index>0) { int rand = r.Next(index); int tmp = 0; tmp = cards[rand]; cards[rand] = cards[index]; cards[index] = tmp; index--; } }
發牌時初始化1個2維數組,行列分別爲4,17.而後依次發牌,知道剩餘3張放入數組.
完整代碼以下:
using System; class ctest { static void Main() { int[] cards = new int[54]; int[,] persons = new int[4,17];//3人和剩餘; for(int i = 0;i<cards.Length;i++) cards[i] = i+1; Shuffle(cards); DealCards(persons,cards); //print(cards); print(persons); } static void DealCards(int[,] persons,int[] cards){ // persons[4,0] = cards[0]; // persons[4,1] = cards[1]; // persons[4,2] = cards[2]; // int count = 3; // while(count<cards.Length){ // int index = count % 3; // persons[index,cards.Length/3]=cards[count]; // count++; // } int count=0; for(int i = 0;i< 3 ;i++){ for(int j = 0;j<17;j++){ persons[i,j] = cards[count++]; } } for(int i=0;count<cards.Length;i++) persons[3,i] = cards[count++]; } static void Shuffle(int[] cards) { int length = cards.Length-1; int index = length; Random r = new Random(); while(index>0) { int rand = r.Next(index); int tmp = 0; tmp = cards[rand]; cards[rand] = cards[index]; cards[index] = tmp; index--; } } static void print(int[] mat) { for(int i = 0;i<mat.Length;i++) Console.Write(mat[i]+" "); Console.WriteLine(); } static void print(int[,] persons) { for(int i = 0;i < 4; i++) { for(int j = 0;j<17;j++) Console.Write(persons[i,j]+" "); Console.WriteLine(); } } }
算法題2:以C#或JavaScript語言實現方法,計算參數(m)的表達式1+2-3+4-5...m的值.
這個題其實很簡單,就是偶數符號的變化.
class test { static void Main() { Console.WriteLine(CalculateSum(6)); Console.Read(); } static int CalculateSum(int m) { int sum = 1; for(int i = 2 ; i <= m; i++) { if(i%2==0) sum+=i; else sum-=i; } return sum; } }
數據庫題:SqlServer2005,表DataTable
id | value |
1 | 1 |
2 | 1 |
5 | 2 |
6 | 2 |
8 | 3 |
9 | 3 |
1.將左表中的數據,按id排序,每兩行一組求value的和,生成一張新的視圖.
2.按id排序,取得全部的奇數(單數)行value之和.
3.取得全部id爲奇數的行value之和.
從題目能夠看出難度依次下降.
首先建表:
CREATE TABLE [dbo].[DataTable](
[Id] [int] NULL,
[Value] [int] NULL
) ON [PRIMARY]
3.SELECT SUM(Value) SumValue FROM DataTable dt WHERE id%2=1
2.SELECT SUM(m.value) SumValue FROM (
SELECT ROW_NUMBER() OVER(ORDER BY id) row,id, VALUE FROM
DataTable dt) m WHERE m.row%2=1
1.只能想到這種取出值插入表的方式,使用rownum也好,使用遊標也好.
CREATE TABLE #temp(SumValue INT)
DECLARE @count INT,
@index INT = 1,
@l INT = 1,
@value INT
SELECT @count=COUNT(*) FROM DataTable dt
WHILE(@index<=@count)
BEGIN
SELECT @value = SUM(dt.VALUE) FROM (
SELECT ROW_NUMBER() OVER(ORDER BY id) row,id, VALUE FROM
DataTable) dt WHERE dt.row BETWEEN @l AND @l+1
INSERT INTO #temp(SumValue)VALUES(@value)
set @index=@index*2
SET @l=@index+1
END
SELECT * FROM #temp t
小公司,簡單的題目.這應該算泄題了:)