公司笔试题
去年2月份的时候刚来深圳,在第一家公司面试,也是我现在所在的公司.当时主管给我做了一套笔试题,结果不是很理想,当时我还特意写了篇博文:求职路 第二章 技术篇
被录用之后,我找主管要了一份当时的笔试题,又重新做了次.昨天偶然发现了这张试题,算是对自己的一个回顾.
主要是2道算法题和1道sql题,当时确实很菜,算法题有错误,而sql全挂,也感谢老大把这么菜的我招到麾下,让我磨练至今.当然现在我的sql依然很菜,确实不太有兴趣研究数据库.
算法题1:以C#或JavaScript语言实现一个斗地主的发牌算法.(都地主发牌规则:共54张牌,3人打,没人发17张,剩余3张.)
PS:其实我以前没玩过斗地主,后来才知道怎么玩.当然还是不怎么喜欢玩:)
我理解这个题,就是把54张牌先预制好,然后打乱顺序,依次发给3个玩家.最核心的应该是洗牌的算法.我的思路是:
1.生成一个长度为54的数组.为数组赋上初值1~54.
2.在1~54中生成一个随机数.
3.把这个数的位置与数组最后一位交换.
4.依次递减数组长度.直到长度为0.
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
小公司,简单的题目.这应该算泄题了:)
作 者:doku
出 处:http://www.cnblogs.com/kulong995/
关于作者:喜欢编程,喜欢美食,专注于.NET项目开发。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!