Momenta在线面试题

Momenta在线面试题

岗位:忘了投的什么岗位来着,可能是后台开发
日期:2018.12.22


选择题 (12道 * 5分)

  • https://www.nowcoder.com/questionTerminal/677ebdf5533943868ff7c8b8c1377f46

  • C++将父类的析构函数定义为虚函数,下列正确的是哪个?(释放父类指针时能正确释放子类对象)

    • 释放父类指针时能正确释放子类对象
    • 释放子类指针时能正确释放父类对象
    • 这样做是错误的
    • 以上全错
  • https://www.nowcoder.com/questionTerminal/242d747044bd417e95fe37d69884dff8

  • 声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是(int (*(*p)[10])(int *))

    • (int p[10])(int
    • int [10]*p(int *)
    • int (*(*p)[10])(int *)
    • int ((int *)[10])*p
    • 以上选项都不正确
  • https://www.nowcoder.com/questionTerminal/85cdddf3a2fd4ff992156c4e93eb8480?source=relative

  • 在一台主流配置的PC机上,调用f(35)所需的时间大概是_______。(几秒)

    • 几毫秒
    • 几秒
    • 几分钟
    • 几小时
int f(int x) {
    int s=0;
    while(x-- >0)   s+=f(x);
    return max(s,1);
}
  • 打开文件时可单独或组合使用下列文件打开模式: ①ios_base::aop②ios_base::binary③ios_base:: ④io
    若要以二进制读方式打开一个文件,需使用的文件打开模式为(C)
    A)①③ B)①④ C)②③ D)②④
    ios_base::binary代表二进制方式
    ios_base::in 代表读入方式

  • 从0到n-1中随机等概率输出m个不重复的数

void knuth(int n,int m)
{
  srand((unsigned int)time(0));
  for(int i = 0;i<n;i++)
  {
    if(rand()%(n-i)<m)
    {
      cout<<i<<endl;
      m--;
    }
  }
}
  • 写出下列程序再x86上运行的结果(50
    • 60
    • 50
    • 30
    • 20
// 源代码跑不了
#include 
using namespace std;
struct mybitfields{
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
}test;

int main(void){
    int i;
    test.a = 2;
    test.b = 3;
    test.c = 0;

    i = *((short *) & test);
    printf("%d\n", i);
}
  • 有如下程序:pass,运行时的输出结果是(2332)。
    • 3232
    • 2332
    • 2323
    • 3223
#include 
using namespace std;
class Base{
    public:
        Base(int x = 0):valB(x){ cout << valB;}
        ~Base(){ cout << valB;}
    private:
        int valB;
};
class Derived : public Base{
    public:
        Derived(int x = 0, int y = 0):Base(x),valD(y){ cout << valD;}
        ~Derived(){cout << valD;}
    private:
        int valD;
};
int main(){
    Derived objl2(2, 3);
    return 0;
}
  • 在32位小端的机器上,如下代码输出是什么(b
    • 0x201, 0x403
    • 0x201, 0x605
    • 0x201,
    • 0x102,
char array[12] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
short *pshort = (short *)array;
int *pint = (int *)array;
int64 *pint64 = (int64 *)array;
printf("0x%x, 0x%x, 0x%||x, 0x%||x", *pshort, *(pshort + 2), *pint64, *(pint + 2));
  • 输出结果(A B C deA
#include 
using namespace std;
class A{
    public:
        A(){
            printf("A ");
        }
    /* virtual */
    ~A(){
        printf("deA ");
    }
};

class B{
    public:
        B(){
            printf("B ");
        }
        ~B(){
            printf("deB ");
        }
};

class C: public A, public B{
    public:
        C(){
            printf("C ");
        }
    ~C(){
        printf("deC ");
    }
};

int main(){
    A *a = new C();
    delete a;
    return 0;
}
  • cpp 多态

    • 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
  • 下列代码试图打印数字1-9的全排列组合。
    其中run函数中缺失的部分应该依次为:(D)
    A n+1, n, n+1
    B n+1, n, n
    C n, n, n
    D n, n+1, n+1
    E n+1, n+1, n+1
    F n, n, n+1

#include "stdio.h"
#define N 9
int x[N];
int count = 0;
 
void dump() {
  int i = 0;
  for (i = 0; i < N; i++) {
    printf("%d", x[i]);
  }
  printf("\n");
}
 
void swap(int a, int b) {
  int t = x[a];
  x[a] = x[b];
  x[b] = t;
}
 
void run(int n) {
  int i;
  if (N - 1 == n) {
    dump();
    count ++;
    return;
  }
  for (i = ___; i < N; i++) {
    swap(___, i);
    run(n + 1);
    swap(___, i);
  }
}
 
int main() {
  int i;
  for (i = 0; i < N; i++) {
    x[i] = i + 1;
  }
  run(0);
  printf("* Total: %d\n", count);
}

算法题 (2道 * 20分)

1.编号转换
  • http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3821&konwledgeId=40

  • https://www.nowcoder.com/questionTerminal/14a1f7bad0404b448da551c724c54cd4

  • 小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。

  • 表格单元所在的行则是按数值从1开始编号的,表格单元名称则是其列编号和行编号的组合,如单元格BB22代表的单元格为54列中第22行的单元格。

  • 小B感兴趣的是,编号系统有时也可以采用RxCy的规则,其中x和y为数值,表示单元格位于第x行的有第y列。上述例子中的单元格采用这种编码体系时的名称为R22C54。

  • 小B希望快速实现两种表示之间的转换,请你帮忙设计程序将一种方式表示的坐标转换为另一种方式。

  • 输入:输入的第一行为一个正整数T,表示有T组测试数据(1<=T<=105)。随后的T行中,每行为一组测试数据,为一种形式表示的单元格坐标。保证所有的坐标都是正确的,且所有行列坐标值均不超过106。
    2
    R23C55
    BC23

  • 输出:对每组测试数据,单独输出一行,为单元格坐标的另一种表示形式。
    BC23
    R23C55

  • code:


2.偶数大翻转
  • 今天的计算机课上,老师给同学们出了一道题:
    输入n个数,请将其中的偶数的二进制反转。
  • eg:输入1 6 5
    其中6是偶数,二进制表示为110,反转后为011,代表3,所以最终输出1 3 5.
  • 小贱君最近脑子不怎么好使,想了半天也没想出来如何做,最后他向你寻求帮助了,帮帮可怜的小贱君吧!
  • 输入描述:
    输入包含多组测试数据。
    对于每组测试数据:
    N — 输入的数字个数
    N个数:a0,a1,…,an-1
  • 保证:
    1<=N<=3000,0<=ai<=INT_MAX.
    输出描述:
    对于每组数据,输出N个整数。
  • 示例1
  • 输入
5
1 3 10 6 7
6
26 52 31 45 82 34
  • 输出
1 3 5 3 7
11 11 31 45 37 17
  • code:
#include 
using namespace std;

int flip_num(int x){
    if (x & 1) return x; // 判断奇偶
    int n = 0;
    while(x){ // 借鉴翻转整数的思路
        n = (n << 1) | (x & 1);
        x = x >> 1;
    }
    return n;
}

int main(){
    int n;
    int x;
    while(cin >> n){
        for (int i = 0; i < n; ++i){
            cin >> x;
            cout << flip_num(x);
            if (i != n - 1)
                cout << ' ';
        }
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(面试题)