zoukankan      html  css  js  c++  java
  • 公司笔试题

        去年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

    小公司,简单的题目.这应该算泄题了:)

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/kulong995/p/3416880.html
Copyright © 2011-2022 走看看