【C++】笔试强训 第一天

发布于:2025-05-23 ⋅ 阅读:(20) ⋅ 点赞:(0)

如果你已经对C/C++略知一二,现在正在复习C/C++的一些重点知识

这些看似简单的题目能拿满分吗?

-------------------------------------------------------------------------------------------------------------------------

关注我🌈,每天更新总结文章(多以图文形式,方便记忆,均为网上搜集资料以及AI)⭐

-------------------------------------------------------------------------------------------------------------------------

时间:2025/5/22/ 19: 04分

-----------------------------------

博主链接:黎明smaly-CSDN博客

快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区


一、选择题

  1.以下 for 循环的执行次数是()
for (int x = 0, y = 0; (y = 123) && (x < 4); x++);

A. 无限循环
B. 循环次数不定
C. 4 次
D. 3 次

答案:C

解析:y=123一直为真     x执行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

解析: %5.3s 

   5代表输出字符宽度为5个字符,若字符串长度小于5,会在字符串前补空格以达到宽度5        .3代表截取前三个字符

 这里就是截取前三个字符,并且前面补两个空格,但显示时一般看不到空格,可以忽略

   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是第一次的判断条件,j=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!=2为真,然后后面的c--!=3就不再执行了

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

答案:C

解析:隐式类型转换

  6.在 int p [][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}; 中,p [1][2] 的值是()
A. 1
B. 0
C. 6
D. 2

答案:B

解析:这个就不用了把.....

  7.选择表达式 11|10 的结果(本题数值均为十进制)()
A. 11
B. 10
C. 8
D. 2

答案:A

解析:或运算符正常运算即可

  8.int fun (int a) { a^=(1<<5)-1; return a; } fun (21) 运行结果是()
A. 10
B. 5
C. 3
D. 8

答案:A

解析:^= 异或运算符 相同为0 不同为1 

           << 左移  00000001左移5位: 00010000 = 32

  9.若有定义语句:int year=1009,*p=&year; 以下不能使变量 year 中的值增至 1010 的语句是()
A. ++(*p)
B. *p++
C. (3)*p+=1;
D. (3)(*p)++

答案:B

解析:++优先级大于*号

  10.下面关于 "指针" 的描述不正确的是()
A. 当使用 free 释放掉一个指针内容后,指针变量的值被置为 NULL
B. 32 位系统下任何类型指针的长度都是 4 个字节
C. 指针的数据类型声明的是指针实际指向内容的数据类型
D. 野指针是指向未分配或者已经释放的内存地址

答案:A

解析:释放完,指针变量值不变,需要自己设置为NULL

二、编程题

1.题目链接:组队竞赛_牛客笔试题_牛客网

思路讲解:

根据题目,我们可以发现,尽可能的求出每次第二高的值就是答案

我们怎样拿到第二高呢?我们只需要把最大值拿出放每个组里即可

1.为了更好的取高值,我们首先对数组进行排序,升序,从小到大

2.我们每次取三个值,这三个值我们首先从开头开始取出最小值

   然后,从尾巴取出第二高和最大值

3.这样我们第一次取出三个值,就拿到了一个第二高

4再从剩下的里面按次步骤继续取,最后把每组的第二高加起来即可

我们这里不需要每个步骤都写,因为根据结果,总结出了规律,每组的第二高值为

数组名【下标:数组长度-2*i】 i为组数
代码:

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

int main() {
    int n;
    scanf("%d",&n);
    int len = 3*n;
    int *arr = (int*)malloc(sizeof(int)*len);
    for(int i = 0;i<len;i++)
    {
        scanf("%d",&arr[i]);
    }
    sort(arr,arr+len);
    int i = n;
    long long sum = 0;
    while(i>0)
    {
        sum =arr[len-2*i]+sum;
        i--;
    }
    printf("%ld",sum);
}

2.题目链接:删除公共字符_牛客题霸_牛客网 

思路讲解:

方法一:暴力求解

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

int main()
{
    string str1, str2;
    getline(cin, str1);
    cin >> str2;
    for(size_t j = 0; j < str2.size(); ++j){
        while(str1.find(str2[j]) != string::npos)
            str1.erase(str1.find(str2[j]), 1);
    }
    cout << str1 << endl;
    return 0;
}

方法二:使用哈希

字符无非也就128个,我们创建一个128个大小的数组

然后由于频繁的删除会挪动数据,性能降低

我们再开辟一个新字符串,最后转移一下即可

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

int main()
{
    string str1, str2;
    getline(cin, str1); // cin遇到空格就结束了,用getline输入一行
    getline(cin, str2);
    int hash[128] = {0};
    string ret;
    for(int i = 0; i < str2.size(); ++i)
        hash[str2[i]]++;
    for(int i = 0; i < str1.size(); ++i){
        if(hash[str1[i]] == 0)
            ret += str1[i];
    }
    cout << ret << endl;
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到