• 公司笔试题


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

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

  • 相关阅读:
    absolute 导致点击事件无效
    windows 下的命令操作
    localStorage 设置本地缓存
    css渐变
    vue-cli webpack全局引入jquery
    #024分段函数。
    #023单词接龙1(字符串)(女友)
    #022 Python 实验课
    #021 Java复习第一天
    #020PAT 没整明白的题L1-009 N个数求和 (20 分)
  • 原文地址:https://www.cnblogs.com/kulong995/p/3416880.html
Copyright © 2020-2023  润新知