【笔试强训】Day_01

文章提供了几个C++相关的选择题,涉及for循环执行次数、字符串格式化输出、函数执行结果等知识点,并对每个问题进行了详细解答。此外,还介绍了两个编程题,一个是根据排序后的数据进行分组的贪心算法问题,另一个是利用哈希表删除字符串公共字符的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、选择题

1、

2、

3、

4、

5、

6、

7、

8、

9、

10、

二、编程题

1、组队竞赛

 2、删除公共字符


一、选择题

1、

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

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

A 、是无限循环
B 、循环次数不定
C、 4次
D 、3次
答案:C

解释:

先复习一下 for循环的用法:

for(初始化部分;条件判断部分;调整部分) 

{ // 循环体}

执行次数为 x = 0、1、2、3, x = 4 跳出循环,所以选择C

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

解释:

每个字符串结尾都有一个默认的 ‘/0’,%s 打印遇到 ‘/0’ 就停止打印,所以第一 个 “computer” 会完整打印

先来解释一下通用的:%m.ns

m:输出字符串的宽度

n:左起截止目标字符串的 n个字符,并且是右对齐,左边不够补空格

  • 当 字符串长度 > n ,此时 m的作用失效了,直接截取 n个字符,并且是右对齐,左边不够补空格,格式输出宽度依旧为 m
  • 当 字符串长度 < n ,作用和 %s 一样,遇到 ‘\0’ 就停止,会完整打印整个字符串

        题目中的 %5.3s ,字符串长度8 > 3,5 的作用失效了,直接截取前 3个字符 ‘com’,格式输出宽度依旧为 5,右对齐,左边不够补空格,所以输出结果为:'  com'

所以选择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,而 j 开始的值就为 -1,不满足循环条件,所以 k 依旧为 0,所以选择B

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 语句还省略了缩进 {},我们看代码就容易出错

else 有最近匹配原则,所以 else会与它最近的 if 进行匹配

 还有要注意一点:|| 逻辑或:任意一方为真就执行。左边表达式为真,右边的表达式就不会执行

如题 if(a == 1 && b++==2),表达式左边为真,右边的表达式就不会执行,-- 也就不会执行,所以选择D

5、

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

答案:C

解释:

'A’是char类型,占一个字节,范围是-128 ~ 127
a是int 类型, 占4个字节,范围是 -21亿 ~ 21亿
c是double类型,占8个字节,范围是2.310的308次方 ~ 1.710的308次方

不同类型运算会自动提升(向高位提升),即小范围 -> 大范围,最后转换为double类型,所以答案选C

6、

int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};

中,p[1][2]的值是()
A 、1
B、 0
C 、6
D 、2
答案:B

解释:

p 数组的每个大括号是一行,都没有进行完全初始化,没初始化的默认为0, p[][4] 第一个参数没给,这是可以的,有几行第一个参数就为几,数组下标从 0 开始

数组补充完如下

1 0 0 0

3 2 0 0

4 5 6 0

0 0 0 0 

所以 p[1][2] = 0,标红色的,所以选择B

7、

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

解释:

写出两个数的补码(正数的原码、反码、补码相同)

假设用8个 bit 表示:

11: 0000 1011

10 :0000 1010

| 按位或的规则:只有有一个为 1,结果 位 就为 1,其余情况为 0

转换为十进制就是 11,所以选择A

8、

fun(21)运行结果是()

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

A 、10
B、 5
C、 3
D 、8
答案:A

解释:

^ 运算符的规则为:相同为0,相异为1

a ^= b  ---> a = a^b;

则 a ^= (1<<5)-1  ---> a = a ^ ((1<<5)-1)

1 << 5 就是 1 向左移动 5 个bit,0000 0001  ---> 0010 0000,十进制为32

最后 a = a ^ 31  ---> a = 21 ^ 31

最后转成十进制就是10,所以答案选A 

9、

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

B 、(*p)++

C、 ++(*p)

D、 *p++

答案:D

解释: 这里考察的是运算符的优先级

 由图得知 * 的优先级大与 +=,()的优先级比 ++ 高

++ 的优先级比 * 要高,没有对1009进行++,而是对指针++,所以选择D

10、

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

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

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

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

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

答案:A

解释:

free指针只是把指向的空间销毁了 ,指针的值置空是要我们手动置空 

32位指针的长度都是4个字节,64位下是8字节

再说一下造成野指针的三大原因

  1. 定义时,没有初始化
  2. free掉后,没有置空
  3. 越界访问使用指针

所以选择A 

二、编程题

1、组队竞赛

题目链接:组队竞赛

思路分析:

  1. 首先对数据进行排序
  2. 然后进行分组,前面取一个后面取两个
  3. 然后对中间下标进行观察,可以发现规律

解题关键:如何进行分组(主要思路是贪心算法)

代码如下(C++):

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

int main()
{
    int n = 0;
    cin >> n;
    vector<int> arr;
    arr.resize(n*3);
    for(int i = 0; i < arr.size(); ++i)
    {
        cin >> arr[i];
    }
    sort(arr.begin(), arr.end());
    
    long long sum = 0;
    for(int i = 0; i < n; ++i)
    {
        sum += arr[arr.size() - 2*(i+1)];
    }
    
    cout << sum;
    
    return 0;
}

 2、删除公共字符

题目链接:删除公共字符

思路分析:

  1. 使用哈希思想,定义一个数组,遍历 s2,把 s2 里面有的字符映射到数组上
  2.   再遍历 s1,比较为0就插入 ret 中,即不重复的字符

代码如下(C++):

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

int main() 
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    
    int hash[256] = {0};
    for(int i = 0; i < s2.size(); ++i)
    {
        hash[s2[i]]++;
    }

    string ret;
    for(int i = 0; i < s1.size(); ++i)
    {
        if(hash[s1[i]] == 0)
        {
            ret += s1[i];
        }
    }

    cout << ret;

    return 0;
}

----------------我是分割线---------------

Day_01完结,下篇即将更新

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不再维护

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值