备战秋招 | 笔试强训1

目录

前言

一、选择题

二、编程题

三、选择题题解

四、 编程题题解


前言

        本栏目主要为准备备战秋招的小伙伴准备,博主会每天准备一些题目,如果有兴趣跟着博主每日一刷吧!加油加油!

一、选择题

1、以下for循环的执行次数是()


for(int x = 0, y = 0; (y = 123) && (x < 4); x++);

A. 是无限循环

B. 循环次数不定

C. 4次

D. 3次

2、以下程序的运行结果是()

#include <stdio.h>
int main(void) 
{
    printf("%s , %5.3s\n", "computer", "computer");
    return 0;
}

A. computer , puter

B. computer ,   com

C. computer ,   computer

D. computer , compu.ter

3、下列main()函数执行后的结果为()

int func()
{
    int i, j, k = 0;
    for(i = 0, j = -1;j = 0;i++, j++)
    {
        k++;
    }
    return k;
}

int main()
{
    cout << (func());
    return 0;
}

A. -1

B. 0

C. 1

D. 2

4、下面程序输出是什么?

#include <stdio.h>
int main()
{
    int a=1,b=2,c=3,d=0;
    if(a == 1 && b++==2)
         if(b!=2||c--!=3)
             printf("%d,%d,%d\n" ,a,b,c);
         else
             printf("%d,%d,%d\n" ,a,b,c);
    else
         printf("%d,%d,%d\n" ,a,b,c);
    return 0;
}

A. 1,2,3

B. 1,3,2

C. 3,2,1

D. 1,3,3

5、若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()

A. char

B. int

C. double

D. float

6、在 int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}; 中,p[1][2]的值是()

A. 1

B. 0

C. 6

D. 2

7、选择表达式 11|10 的结果(本题数值均为十进制)()

A. 11

B. 10

C. 8

D. 2

8、fun(21)运行结果是()

int fun(int a)
{
    a^=(1<<5)-1;
    return a;
}

A. 10

B. 5

C. 3

D. 8

9、若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()

A. *p+=1;

B. (*p)++;

C. ++(*p)

D. *p++

10、下面关于"指针"的描述不正确的是()

A. 当使用free释放掉一个指针内容后,指针变量的值被置为NULL

B. 32位系统下任何类型指针的长度都是4个字节

C. 指针的数据类型声明的是指针实际指向内容的数据类型

D. 野指针是指向未分配或者已经释放的内存地址

二、编程题

1、组队竞赛  题目链接 

输入描述:

输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)

第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.

输出描述:

输出一个整数表示所有队伍的水平值总和最大值.

2、删除公共字符  删除公共字符

 输入描述:

每个测试输入包含2个字符串

输出描述:

输出删除后的字符串

三、选择题题解

1、以下for循环的执行次数是()


for(int x = 0, y = 0; (y = 123) && (x < 4); x++);

A. 是无限循环

B. 循环次数不定

C. 4次

D. 3次

正确答案:C

题解:

        这题主要考察对于逻辑运算符与(&&)的理解,我们首先要知道的是,与是双目运算符,只有左右两个表达式都为真的时候才为真,我们先看与(&&)左边的表达式,y = 123,注意,这是一个赋值表达式,返回值为赋值符右边的值,为123,非零,故为真,且永为真,所以我们接下来只考虑右边的表达式 x < 4,x的初值为0,且每次循环+1,故循环4次到4,然后退出循环;

2、以下程序的运行结果是()

#include <stdio.h>
int main(void) 
{
    printf("%s , %5.3s\n", "computer", "computer");
    return 0;
}

A. computer , puter

B. computer ,   com

C. computer ,   computer

D. computer , compu.ter

真确答案:B

题解:

        此题涉及printf函数的格式控制的使用,这里我们要打印的是字符串(%s),百分号与s中出现了一个5.3,这时很多小伙伴就看不懂了,首先我们把5.3看成格式m.n,其中m代表打印所占的屏幕像素个数,如果m大于字符串个数时,会将字符串都打印出来;比如

char* str1 = "hello";

printf("%3s", str1);  // 这里依旧打印五个字符hello
printf("%7s", str1);  // 这里会打印  hello,但是不同的是这里前面会补两个像素(空格)位置

如果格式为%-ms;代表右对齐(默认为左对齐),此时像素会在后面补;

%.ns中的n代表我们要输出几个字符,从左到右依次去字符;看本题为%5.3s;因此我们首先取5个屏幕像素,且以默认的左对齐;接着.3;我们取三个字符;因此答案为B; 

3、下列main()函数执行后的结果为()

int func()
{
    int i, j, k = 0;
    for(i = 0, j = -1;j = 0;i++, j++)
    {
        k++;
    }
    return k;
}

int main()
{
    cout << (func());
    return 0;
}

A. -1

B. 0

C. 1

D. 2

正确答案:B

题解:

        这是一道细节考察题;我们仔细看循环条件,j = 0;为一个赋值,并不是双等号的判断,因此,我们前面提过,赋值的返回值为其所赋的值,本题为0,为假,故循环一次都不会进去,故返回值k为0;打印0;

4、下面程序输出是什么?

#include <stdio.h>
int main()
{
    int a=1,b=2,c=3,d=0;
    if(a == 1 && b++==2)
         if(b!=2||c--!=3)
             printf("%d,%d,%d\n" ,a,b,c);
         else
             printf("%d,%d,%d\n" ,a,b,c);
    else
         printf("%d,%d,%d\n" ,a,b,c);
    return 0;
}

A. 1,2,3

B. 1,3,2

C. 3,2,1

D. 1,3,3

正确答案:D

题解:

        本题主要考察的是逻辑运算符与&&(与)和逻辑运算符 ||(或),其中逻辑与必须两边都是为真才为真,逻辑或有一边为真就为真,这里还有一个小细节,逻辑或只要判断一边为真,另一边就不需要判断了。判断顺序必须先判断左边的表达式,然后再判断右边的表达式;首先进入第五行的 if 判断;左边为真,右边是b的后置++,故也为真;且运行完此行后,b的值为3;接着进入第六行的 if 语句,这里是逻辑或,b!=2为真,故右边的表达式无需进入(c--未运行),直接打印最后结果;

5、若有定义语句: int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()

A. char

B. int

C. double

D. float

正确答案:C

题解:

        这里主要考察类型转换的问题,在C/C++中,在不同类型进行运算时,会往类型大的那个类型进行转换,这里字符A+a(int),结果转换为int型,接着+b(double),结果转换为double型;

6、在 int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}; 中,p[1][2]的值是()

A. 1

B. 0

C. 6

D. 2

正确答案:B

题解:

        这里是对二维数组的考察,数组的下标是从0开始的,根据题意,我们需要的值为第二行第三个数据,但是第二行才初始化了两个数据,其他位置补0,因此答案为B;

7、选择表达式 11|10 的结果(本题数值均为十进制)()

A. 11

B. 10

C. 8

D. 2

正确答案:A

题解:

        这里考察的是位运算符按位或(|),即每个比特位按位或,如果有一个为1则将这个比特位置为一,只有全零才将这个比特位置为零;我们将这两个数按二进制展开并或,得到结果11;

8、fun(21)运行结果是()

int fun(int a)
{
    a^=(1<<5)-1;
    return a;
}

A. 10

B. 5

C. 3

D. 8

正确答案:A

题解:

        这里考察的也是位运算,左移操作符(<<),将数字的二进制形式向左移,右边补零;按位异或运算符(^),把两个数的二进制位按位异或,异或规则:相同置为0,不同置为1;这里注意是^=,意味着我们先将^=右边的表达式运算完后再进行^=;不难算出最后结果为10;

9、若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是()

A. *p+=1;

B. (*p)++;

C. ++(*p)

D. *p++

正确答案:D

 题解:

        这里主要考察运算符的优先级与结合性,我们首先查表,发现*与++是同一等级运算顺序;我们再看结合顺序,发现结合顺序是从右到左,因此先计算++,然后再计算*;

10、下面关于"指针"的描述不正确的是()

A. 当使用free释放掉一个指针内容后,指针变量的值被置为NULL

B. 32位系统下任何类型指针的长度都是4个字节

C. 指针的数据类型声明的是指针实际指向内容的数据类型

D. 野指针是指向未分配或者已经释放的内存地址

正确答案:A

题解:

         在我们free一个指针后,我们会释放该指针指向的那块在堆上申请的空间,但并不会值指针变量置为NULL;

四、 编程题题解

1、组队竞赛

思路:首先我们对选手水平值进行排序,我们每次取最大水平值、次大水平值与最小水平值为一组,这样可以组成平均水平值最大的排列;

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() 
{
    int n;
    cin >> n;
    vector<int> v1;
    // 避免多次扩容引起的时间消耗
    v1.reserve(3 * n);
    // 获取选手数据
    for(int i = 0; i < 3 * n; i++)
    {
        int num;
        cin >> num;
        v1.push_back(num);
    }
    sort(v1.begin(), v1.end());
    // 这里不能为int,因为,数据类型的范围是1到10的5次方
    long long sum = 0;
    int index = 3 * n - 2;
    // 一次加上每组次大大数据
    for(int i = 0; i < n; i++)
    {
        sum += v1[index];
        index -= 2;
    }
    cout << sum << endl;
    return 0;
}

2、删除公共字符

思路一:

        使用STL库中的函数解决(效率不高)

#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string s1, s2;
    // 不可以用cin,因为输入数据可能存在空格
    getline(cin, s1);
    getline(cin, s2);
    int pos = s1.find_first_of(s2);
    while(pos != s1.npos)
    {
        s1.erase(pos, 1);
        pos = s1.find_first_of(s2);
    }
    cout << s1 << endl;
}

        不建议使用这种方法,效率不是很高,面试官看了也会觉得很没新意;

 思路二:

        使用map将第二个字符串中的每个字符记录下来,然后依次比较s1中每个字符;

#include <iostream>
#include <string>
#include <map>
using namespace std;

int main() 
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    string ret;
    // 避免扩容引起的时间开销
    ret.reserve(s1.size());
    map<char, int> record_char;
    // 记录到map中
    for(auto& e : s2)
    {
        record_char[e]++;
    }
    // 依次与s1中字符比较
    for(auto& e : s1)
    {
        if((record_char.find(e)) == record_char.end())
        {
            ret.push_back(e);
        }
    }
    cout << ret << endl;
}

        思路二与思路三中,没有使用erase,而是新创建一个string来接收,这是因为erase在中间位置的消耗太大了,这里不推荐; 

思路三:

        利用计数排序的思想,将第二个字符串映射到数组中;(完全手搓)

#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    string ret;
    // 避免扩容引起的时间开销
    ret.reserve(s1.size());
    // 开数组一一映射
    int count_char[256] = {0};
    for(auto& e : s2)
    {
        count_char[e]++;
    }
    // 依次与s1中字符比较
    for(auto& e : s1)
    {
        // 如果未曾映射过则push_back
        if(count_char[e] == 0)
            ret.push_back(e);
    }
    cout << ret << endl;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值