zoukankan      html  css  js  c++  java
  • 笔试总结篇(一) : 广州X公司笔试

    一.单选题:

    Ps : 当时由于去广州路上颠簸很困,导致刚做几分钟题目就睡了一觉。起来发现20分钟过去了。擦擦!

    1. 假设磁盘文件foobar.txt 由 6个ASCII 码字符“foobar” 组成,那么程序的输出是什么?

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <fcntl.h>
     4 int main(int argc, char const *argv[])
     5 {
     6     int fd1, fd2;
     7     char c;
     8     fd1 = open("foobar.txt", O_RDONLY);
     9     fd2 = open("foobar.txt", O_RDONLY);
    10     read(fd1, &c, 1);
    11     read(fd2, &c, 1);
    12     printf("c=%c
    ", c);
    13     return 0;
    14 }

    A.f B.o C.b D.a

    我的思路是 先从fd1 指向文件里面读一个字符赋给字符c,之后在从fd2 里面读一个字符赋给字符c,当然是覆盖了,所以是 f 如果第二个read里面读的是fd1 文件描述副,那么答案就应该是 o,因为读了两次。o会覆盖之前的c。

    2.还是foobar.txt文件,下面程序的输出是什么?

     1 #include <stdio.h>
     2 #include <fcntl.h>
     3 #include <unistd.h>
     4 
     5 int main(int argc, char const *argv[])
     6 {
     7     int fd;
     8     char c;
     9     fd = open("foobar.txt", O_RDONLY);
    10     if(fork()==0){
    11         read(fd, &c, 1);
    12         return 0;
    13     }
    14     wait(NULL);
    15     read(fd, &c, 1);
    16     printf("c=%c
    ", c);
    17     return 0;
    18 }

    A.f B.o C.b D.a

    这道题是 o 因为父亲等孩子退出之后才能进行第二次读操作,毕竟前面有wait 要先等待孩子执行完,父进程才可以执行

    3.还是foobar.txt 下面程序输出是什么?

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <fcntl.h>
     4 
     5 int main(int argc, char const *argv[])
     6 {
     7     int fd1, fd2;
     8     char c;
     9     fd1 = open("foobar.txt", O_RDONLY);
    10     fd2 = open("foobar.txt", O_RDONLY);
    11     read(fd2, &c, 1);
    12     dup2(fd2, fd1);
    13     read(fd1, &c, 1);
    14     printf("c=%c
    ", c);
    15     return 0;
    16 }

    A.f B.o C.b D.a

    还是 o ,考察的是dup2 重定向用法,也就是说 是fd1描述符指向fd2, 对fd1操作的时候,就是间接对fd2 进行操作,所以第二次read操作是读的fd2文件。

    4.一下编程语言不是解释执行的是?

    A Javascript     B Python  C  JAVA  D Pascal

    从表面上看:javascript解释执行语言,不需要编译器的介入, 服务器只对动态脚本进行解释或执行
    Python 脚本语言  当然也是解释执行
    JAVA 由虚拟机编译,所以也是解释执行。
    毕竟Pascal 是各大OJ都有的语言,求速度,编译型语言的程序执行效率高,所以Pascal是编译型语言。

    从本质上看:考编译语言和解释语言的区别,编译语言写的程序执行之前需要专门的编译过程,把程序编译成为机器语言的文件,例如exe,之后运行后就不用重新编译了。直接使用exe文件就OK了,毕竟编译一次,多次运行。效率搞。
    解释语言不需要编译,在运行的时候才编译,例如JAVA,专门有一个解释器来执行,这样每执行一次就要翻译一次,效率不高。

    5. 设有CMyClass类的对象a , 那么语句CMyClass b = a; 会调用CMyClass类的?

    A 内存拷贝函数      B 赋值运算符重载函数     C 拷贝构造函数   D 以上都不对

    看C++就郁闷,对C++根本一点不懂,但这不是放弃这道题的借口。
    一点点了解先:
    内存拷贝函数:这个C库函数 memcpy 就是实现这个的,跟C++ 类关联不大,所以第一个排除,但既然有考到,就把memcpy 深深了解一下

    void *memcpy(void *dest, const void *source, size_t count)
    {
         assert((NULL != dest) && (NULL != source));
         char *tmp_dest = (char *)dest;
         char *tmp_source = (char *)source;
          while(count --)//不对是否存在重叠区域进行判断
          *tmp_dest++ = *tmp_source++;
         return dest;
    }

    和字符串拷贝strcpy是有区别的。

    这道题目 主要考 赋值运算符重载函数 和 拷贝构造函数区别,简单的说,拷贝构造函数是用一个已存在的对象去构造一个不存在的对象,也就是初始化一个对象,而赋值运算符重载函数是用一个存在的对象去给另一个已存在并且初始过的对象进行赋值。

    比如:String s1("hello"),s2=s1;//拷贝构造函数
    Sring s1("hello"),s2;
    s1=s2;//赋值运算符重载

    所以答案
    很明显是 拷贝构造函数

    6.下列代码 将打印出:

    #include <stdio.h>
    
    int main(int argc, char const *argv[])
    {
        int a[8] = {0,1,2,3,4,5,6,7};
        int *b = a;
        b+=3;
        if(*b % 2)  b+=2;
        printf("%d
    ", *b);
        return 0;
    }

    A 0  B 3   C  5  D  7

    答案:5  显而易见!

    7. 如下代码会输出:

    #include <iostream>
    using namespace std;
    
    class Echo{
    public:
         Echo(){cout << "+";}
         ~Echo(){cout << "-";}
    }a;
    
    int main(int argc, char const *argv[])
    {
         cout << "s";
         Echo e;
         return 0;
    }

    A: +-s+-
    B:   +s+--
    C:  s+-
    D   s+-+-

    当时想选s+-了,之后发现其他三个答案都有双+双减法,一定是看漏了什么,才发现,原来有个小a在class {...} 后面,这样考的是两个构造函数加析构函数和输出s 之间的顺序,应该是B.

    8.关于数据库的题目,貌似是不会用到索引的是哪一项。果断放弃,不说原因。

    9. 以下不是操作系统的进程调度算法的是?

    A 轮转法  B 最短CPU运行期优先调度算法    C 先进先出算法  D 电梯式调度算法

    果断选电梯了,因为这名字太土啦。 刚学操作系统,还没有讲到调度,不过有看过一点书,而且腾讯面试问到我关于调度,由于刚学操作系统,还没学到调度,所以惨败在操作系统当中。

    10. 二叉树遍历,给你前序中序,求后序,这种数据结构题目就不提了。

    11. C代码中整数不能是用哪种进制表达?

    A 2进制  B 十六进制  C 十进制  D 八进制

    C语言中不能表示二进制,八进制用零开始的数字表示,如032,十六进制用0x开始的数字表示,如0x3f 

    12. 阻塞的 accept 返回发生在三次握手的哪个阶段?

    A 服务端收到客户端的SYN
    B 服务端发出客户端SYN的ACK
    C 服务端收到客户端对SYN的ACK
    D 客户端收到服务端的SYN和ACK

    第一次握手:客户端发送syn包(syn=j)到服务器。
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。
    三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接
    这题目是不是有问题??没选项呀。发生在三次握手之后,只能选第三个阶段了。

    13. 以下说法错误的是?

    class Widget{
         public:
              Widget();
              Widget(const Widget &rhs);
              Widget& operator = (const Widget &rhs);
    };
    
    bool foo(Widget w){
         .....
    }
    
    Widget w1 //语句1
    Widget w2(w1); //语句2
    w1 = w2;
    foo(w1);

    A 语句1调用 Widget();
    B 语句2调用 Widget(const Widget &rhs);
    C 语句3调用 Widget& operator=(const Widget &rhs);
    D 语句4调用 Widget& operator=(const Widget &rhs);

    这道题目应该还是考拷贝构造函数,赋值重载函数,语句1调用了构造函数,语句2调用了拷贝构造函数,语句三是利用了赋值运算符重载函数,语句4是什么东东?貌似是调用了拷贝构造函数。排除法选D

    14.请给出func(65535)的返回值

    int func(intx){
         int countx = 0;
         while(x){
              countx++;
              x = x&(x-1);
         }
         return countx;
    }

    A 65535  B 65536  C 15  D 16

    这道题目出自K&R《程序设计语言》课后题 2-9,今年暑假有做个这个练习,  x&=(x-1) 是求x转化为2进制中1的个数,所以是16.

    15. 请给出下面程序在32bit 小端机器上的输出?

    #include <stdio.h>
    typedef union{
         char a;
         char b;
         int c;
    }Demo;
    
    int main(int argc, char *argv[]) {
         Demo demo;
         demo.a = 'a';
         demo.b = 'b';
         demo.c = 0x64636261;
         printf("size:%zu a:%c b:%c 
    ", sizeof(demo), demo.a, demo.b);
         return 0;
    }

    这题目出题有问题,没有正确答案。如果一定要选一个,应该是B

    A size:4 a:  b:a  c:b
    B size:4 a:  b:a  c:a
    C size:4 a:  b:d  c:c
    D size:4 a:  b:d  c:d

    虽然题目有问题,但它还是很经典的题。考了大小端模式,大端模式地址的增长顺序与值的增长顺序相同,小端模式是与值的增长顺序相反
    例如 : 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
    在大端模式下,前16位应该这样读: e684
    在小端模式下,前16位应该这样读: 84e6

    不过如果站在出题的人的角度上,答案应该是 B,代码错误应该打印c ,应该是 a:a b:a c:a

    #include <stdio.h>
    typedef union{
         char a[4];
         int c;
    }Demo;
    
    int main(int argc, char *argv[]) {
         Demo demo;
    //     demo.a = 'a';
    //     demo.b = 'b';
         demo.c = 0x64636261;
         demo.a[1] = 'e';
         printf("%d
    ", sizeof(char));
         printf("size:%zu a:%c a:%c a:%c a:%c c:%c
    ", sizeof(demo), demo.a[0], demo.a[1], demo.a[2], demo.a[3], demo.c);
         return 0;
    }

    16. C语言的设计发明者是 ?

    A. Dennis Ritchie
    B. Brian Kernighan
    C. John McCarthy
    D. Bjarne Strou-strup

    答案是A,《C程序设计语言这本书》就是C语言的爸爸写的。Brian Kernighan也是其作业,但是没有参与C语言的研究,AWK 和 AMPL 编程语言的作者就是Brian Kernighan. John McCarthy是发明Lisp语言的作者,Lisp语言的强大是C无法比拟的。Bjarne Strou-strup是C++的发明者。变态呀。发明出如此变态的语言。

    17.下列STL容器中,逻辑上相邻的两个元素,内存上必然相邻的是?
    A vector   B set  C list   D map

    vector 是一个能够存放任意类型的动态数组的容器,内存应该相邻。
    set 实现采用了红黑树的平衡二叉树,因此内存不一定相邻
    list 是链表结构,map是 key value 键值对,因此也不一定相邻。

    18.下列代码片段正确的是:

    A int a, &b;b=a;     B . int arr[][] = {{11, 2} ,{0}};
    C typedef void x(int, double);
    D const int s; int arr[s] = {0};

    A中 b没有定义,&b是b的地址 .
    B中 定义二维数组貌似前一个括号内是有数字的。这个编译百分百错误。就算是python 也不可以这样写。
    C 编译是没问题的。我认为是正确的。只是很少有人这么用。
    D  const int s 后面应该赋值,假如 const int s = 1 应该是正确的,没有赋值的话编译不会通过。

    19. 一个模版函数定义为:

    template<typename T1, typename T2> void foobar(T1 a, T2 b=0);
    则下列调用语法错误的是:
    A foobar <int , int>(1,2)   B foobar(1, "c");   C foobar<double, double>(1.1,2);  D foobar(1);

    当时学JAVA的时候记得 模版就是泛型,可以代替  任意变量 例如 int  double 等等,但是变量不能为一个,毕竟声明2两个 T1 T2 ,所以D 显然是不对的。

    每次笔试遇到C++,都很头痛。

    20. 一下程序输出是什么?

    #include <iostream>
    using namespace std;
    
    class A
    {
         public:
              A(){printf("A");}
              virtual ~A(){printf("~A");}
    };
    
    class B:A
    {
         public:
              B(){printf("B");}
              virtual ~B(){printf("~B");}
    };
    
    class C
    {
         public:
              C(){printf("C");}
              ~C(){printf("~C");}
    };
    
    class D:B{
         public:
              D(){printf("D");}
              ~D(){printf("~D");}
              C c;
    };
    
    int main(int argc, char *argv[]) {
         D d;
         return 0;
    }

    A.  ABCD~D~C~B~A
    B.  ABCD~A~B~C~D
    C.  ABDC~C~D~B~A
    D.  DCBA~A~B~C~D

    这道题目选的是A ,这道题目用到了虚函数,我不是很理解,一会在讨论虚函数。之后补充


    二:多选题  (漏选不得分)->尼玛这不坑人么?阿里巴巴 选错还反扣分,更无语。

    最近很多题目要注意32Bit  64bit 毕竟有些题目设计操作系统的话,答案是不同的。


    1.又是一堆代码,吃完晚饭在写。。。。待续。。

  • 相关阅读:
    Java学习路线:day1 Java语言概述
    Java学习路线:day5 Java基本语法(下)2
    Java学习路线:day4 Java基本语法(下)
    Python笔记_第四篇_高阶编程_GUI编程之Tkinter_2.控件类
    Python笔记_第四篇_高阶编程_GUI编程之Tkinter_1.使用Python进行GUI编程的概述
    Python笔记_第三篇_面向对象_9.Python中的"get"和"set"方法(@property和@.setter)
    Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法
    Python笔记_第三篇_面向对象_7.多态
    Python笔记_第三篇_面向对象_6.继承(单继承和多继承)
    Python笔记_第三篇_面向对象_5.一个关于类的实例(人开枪射击子弹)
  • 原文地址:https://www.cnblogs.com/firstrate/p/3369372.html
Copyright © 2011-2022 走看看