【笔试强训】Day1

简介: 【笔试强训】Day1

🌈选择题


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


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


A.是无限循环


B.循环次数不定


C.4次


D.3次


复习一下for循环(初始化部分;条件判断部分;调整部分){}

注意注意!! y=123是赋值 为真的(看清楚)后面就是剩下x = 0、1、2、3 总共四次进入循环

所以答案选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


说实话做题才能查漏补缺,我们知道%s遇到\0就停止打印。是这个%5.3s 我没见过,下面来科普一下


% m.ns:

m : 输出字符串的宽度

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

当字符串 > n > m :此时m的作用失效了,直接截取n

当n > 字符串 :作用和%s一样,遇到\0就停止


所以%5.3s 输出的是 com(com前面两个空格),答案选C


下列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


本题考察的本质还是for循环执行了多少次?

有了上面一题的基础再判断,应该不难


这里的条件判断部分j = 0恒为假,不会进入循环所以K不会++,K等于0,答案选B


下面程序输出是什么?


#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


吐槽一下,上面的代码很乱,且省略了{},像极了我刚开始的样子

但是else有就近匹配原则 : 匹配最近的if

|| 逻辑或:任意一方为真,挡路原则: 左边表达式为真,右边表达式就不会执行


0a2653c851af460fa595bd959398a8f1.png


第一个if就判断为假,直接到最后一个printf 打印,答案是 : D


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


A.char


B.int


C.double


D.float


知识复习:

'A’是char类型,占一个字节,范围是-128 ~ 127

a是int 类型, 占4个字节,范围是 -21亿 ~ 21亿

c是double类型,占8个字节,范围是2.310的308次方 ~ 1.710的308次方


不同类型运算会自动提升,小范围-> 大范围 最后转换为double类型,答案选C


下面,p[1][2]的值是()


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


A.1


B.0


C.6


D.2

每个大括号是一行,都没有进行完全初始化,没初始化的默认为0


0a2653c851af460fa595bd959398a8f1.png


数组坐标从0开始,看图 所以答案是B


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


A.11


B.10


C.8


D.2


简单的逻辑运算


0a2653c851af460fa595bd959398a8f1.png


所以答案选A


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


fun(21)运行结果是()


A.10


B.5


C.3


D.8


此处要注意:1<<5 后等于32 ,再-1 等于31, 最后是a^31 也就是21^31

^ : 相等为0 ,相异为1


0a2653c851af460fa595bd959398a8f1.png


答案是A


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


A.*p+=1;


B.(*p)++;


C.++(*p)


D.*p++


考察的是运算符优先级的问题,忘了要多复习复习


得知 *的优先级大于 +=,()的优先级比++高,唯独++的优先级比*要高,没有对1009进行++,而是对指针++.


毫无疑问 ,答案选D


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


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


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


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


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


解析:

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


ps:造成野指针的三大原因


定义时,没有初始化

free掉后,没有置空

越界访问使用指针

答案选A


🌈编程题


1️⃣组队竞赛

题目链接:组队竞赛


0a2653c851af460fa595bd959398a8f1.png


思路讲解:


2d65d23f6d4748949b924e4057485923.png


首先对数据进行排序

推导出下标满足的公式 arr.len - 2*(i+1),满足最大水平和

算法的头文件记不住 algorithm algorithm algorithm

代码如下


#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    long long sum = 0;
    int n;
    cin>>n;
    vector<int> a;
    a.resize(3*n);
    for(int i=0; i< 3*n; ++i)
    {
        cin >> a[i];
    }
    std::sort(a.begin(), a.end());
    for(int i = 0; i < n ;i++)
    {
        sum += a[a.size()- 2*(i+1)];
    }
    cout << sum << endl;
    return 0;
}


2️⃣删除公共字符

题目地址:添加链接描述


0a2653c851af460fa595bd959398a8f1.png


讲解两种思路:哈希 & 暴力


首先是哈希


遍历这个str2字符串,把对应的字符放到hash[ ]中

遍历str1,找到hash中等于 0 的(也就是没有重复的 )


2d65d23f6d4748949b924e4057485923.png


暴力法:


去str1里面找str2的值,find找到相同的就erase

//哈希
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1, str2;
    //cin>>str1;//cin遇到空格就停止
    getline(cin, str1);
    getline(cin, str2);
    int hash[256] = {0};
    for(int i = 0; i < str2.size(); i++)
    {
        hash[str2[i]]++;
    }
    string end ="";
    for(int i = 0; i < str1.size(); i++)
    {
        if(hash[str1[i]] == 0)//==0的就是不相同的
        {
            end += str1[i];
        }
    }
    cout<<end<<endl;
    return 0;
}


#include <iostream>
#include <string>
using namespace std;
//暴力
int main()
{
    string s1,s2;
    getline(cin,s1);
    getline(cin,s2);
    for(int i = 0;i < s2.size(); i++)
    {
        while(s1.find(s2[i]) != -1)//find找不到就返回npos(-1) !=也就是找到了
        {
            s1.erase(s1.find(s2[i]),1);
        }
    }
    cout<<s1<<endl;
    return 0;
}


相关文章
|
7月前
|
算法 C++
48天C++笔试强训 001(下)
48天C++笔试强训 001(下)
30 1
|
6天前
|
SQL 关系型数据库 MySQL
几道常见面试问题总结(二)
几道常见面试问题总结(二)
|
6天前
|
算法 前端开发 JavaScript
面试必会的几道算法
面试必会的几道算法
|
7月前
|
存储 C语言 C++
48天C++笔试强训 001(上)
48天C++笔试强训 001
37 0
|
11月前
|
算法 编译器 C语言
笔试强训错题总结(一)(下)
笔试强训错题总结(一)
|
11月前
|
存储 编译器 C++
笔试强训错题总结(一)(上)
笔试强训错题总结(一)
104 0
|
11月前
|
算法 数据库
笔试强训错题总结(二)(下)
笔试强训错题总结(二)
|
11月前
|
安全 编译器 C++
笔试强训错题总结(二)(上)
笔试强训错题总结(二)
|
人工智能 安全 测试技术
【笔试强训】Day_02
目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、排序子序列 2、倒置字符串
112 0
【笔试强训】Day_02
|
算法 C++
【笔试强训】Day_01
目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、组队竞赛 2、删除公共字符
76 0
【笔试强训】Day_01