zoukankan      html  css  js  c++  java
  • 网易有道内推笔试

    构造队列
    Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
    Problem Description:
    小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:

    while(!Q.empty()) //队列不空,执行循环
    {
    int x=Q.front(); //取出当前队头的值x
    Q.pop(); //弹出当前队头
    Q.push(x); //把x放入队尾
    x=Q.front(); //取出这时候队头的值
    printf("%d
    ",x); //输出x
    Q.pop(); //弹出这时候的队头
    }

    做取出队头的值操作的时候,并不弹出当前队头。
    小明同学发现,这段程序恰好按顺序输出了1,2,3,...,n。现在小明想让你构造出原始的队列,你能做到吗?
    输入
    第一行一个整数T(T<=100)表示数据组数,每组数据输入一个数n(1<=n<=100000),输入的所有n之和不超过200000。
    输出
    对于每组数据,输出一行,表示原始的队列。数字之间用一个空格隔开,不要在行末输出多余的空格。

    样例输入
    4
    1
    2
    3
    10
    样例输出
    1
    2 1
    2 1 3
    8 1 6 2 10 3 7 4 9 5
    #include <iostream>
    #include <deque>
    using namespace std;
    
    void CreateQueue(int num){
        if(num==0)
            cout<<""<<endl;
        deque<int> deque;
        while(num!=0){
            deque.push_front(num);
            int x=deque.back();
            deque.pop_back();
            deque.push_front(x);
            num--;
        }
        for(int i=0;i<deque.size();i++){
            if(i!=deque.size()-1)
                cout<<deque[i]<<" ";
            else cout<<deque[i]<<endl;
        }
        return;
    }
    int main(){
      int sum=0;
      cin>>sum;
      if(sum==0){
          cout<<""<<endl;
          return 0;
      }
      int* arr=new int[sum];
      for(int i=0;i<sum;i++)
          cin>>arr[i];
    
      for(int j=0;j<sum;j++)
          CreateQueue(arr[j]);
      return 0;
    }

    洗牌
    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
    Problem Description:
    洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。
    现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。
    例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,左手拿着1,2,3;右手拿着4,5,6。在洗牌过程中按顺序放下了6,3,5,2,4,1。把这六张牌再次合成一组牌之后,我们按照从上往下的顺序看这组牌,就变成了序列1,4,2,5,3,6。
    现在给出一个原始牌组,请输出这副牌洗牌k次之后从上往下的序列。

    输入
    第一行一个数T(T<=100),表示数据组数。对于每组数据,第一行两个数n,k(1<=n,k<=100),接下来一行有2n个数a1,a2,...,a2n(1<=ai<=1000000000)。表示原始牌组从上到下的序列。

    输出
    对于每组数据,输出一行,最终的序列。数字之间用空格隔开,不要在行末输出多余的空格。

    样例输入
    3
    3 1
    1 2 3 4 5 6
    3 2
    1 2 3 4 5 6
    2 2
    1 1 1 1
    样例输出
    1 4 2 5 3 6
    1 5 4 3 2 6
    1 1 1 1
    #include <iostream>
    #include <vector>
    using namespace std;
    
    void WashCards(vector<int>& vec,int n,int k){
        vector<int> vec1;
        while(k!=0){
            vec1=vec;
            int index=0;
            for(int i=0,j=n/2;i<n/2&&j<n;i++,j++){
                vec[index++]=vec1[i];
                vec[index++]=vec1[j];
            }
            k--;
        }
        return;
    }
    
    int main(){
        int sum;
        cin>>sum;
        if(sum==0)
            return 0;
        vector<vector<int>> result;
        while(sum!=0){
            int n=0,k=0;
            cin>>n>>k;
    
            vector<int> vec(2*n,0);
            for(int i=0;i<2*n;i++){
                cin>>vec[i];
            }
            WashCards(vec,2*n,k);
            result.push_back(vec);
            sum--;
        }
        for(int i=0;i<result.size();i++){
            for(int j=0;j<result[i].size();j++){
                if(j==result[i].size()-1)
                    cout<<result[i][j]<<endl;
                else cout<<result[i][j]<<" ";
            }
        }
        return 0;
    }

    查找矩形
    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
    Problem Description:
    对于一组水平线段及垂直线段,共有n条,已知其中必定存在一个若干条线段组成的矩形,输出这个矩形的左下角和右上角点,定义左下角点有最小的x值和y值,右上角点有最大的x值和y值。
    线段可以重合,线段必须恰好能组成矩形,即线段不能头或尾部超出矩阵边界,如下图:

    输入
    第一行为线段数 n (4 <= n <= 25)
    接下来有n行,每行为一条线段的首尾点坐标: xi yi xj yj
    坐标值范围 -1e9 <= x, y <= 1e9
    输出
    在一行输出矩形的左下角点和右上角点坐标:
    xi yi xj yj
    根据定义有 xi < xj && yi < yj

    样例输入
    4
    0 0 0 1
    0 0 1 0
    0 1 1 1
    1 0 1 1
    样例输出
    ​0 0 1 1


    后记:

    有道笔试的之前,听说有道笔试很难,所以心里有些怯。然后笔试题的选择题的确也是非常杂。知识点非常广。

    涉及到了计算机组成原理(计算记录位密度)、模式识别(根据先验概率模式分类)、路由聚合、语言类倒是考的不深。

    然后编程题的顺序第一道题是构造队列,这道题我一直不明白到底该怎么做,心里想到了逆序,但是就是没有往深的去想,遇到这种题目应该举例---然后自己动手试试。

    然后第二道题是矩阵,有些难度。

    洗牌最简单的一道题被放到了最后,而我以为最后一道题会很难,然后就懵逼了。

    结论就是:不否定自己,不认为别人NB的一塌糊涂。

    不过分肯定自己,不认为别人弱鸡的一塌糊涂。很多人虽然起步晚,时间花的少,但是天赋在那里,学习力在那里,执行力在那里。找到适合自己的节奏,稳步走下去。

  • 相关阅读:
    《RabbitMQ 实战》读书笔记
    使用jstack命令查看CPU高占用的问题记录
    两种常见的单元测试方式(笔记)
    Apache Solr入门教程(转)
    搜索引擎选择: Elasticsearch与Solr(转)
    CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)
    理解list和vector的区别
    从上往下打印出二叉树的每个节点,同层节点从左至右打印。
    TypeError: Object function (req, res, next) { app.handle(req, res, next); } has no method 'configure'
    Cannot find module 'crc'
  • 原文地址:https://www.cnblogs.com/LUO77/p/5783636.html
Copyright © 2011-2022 走看看