【C++笔试强训】第一天 小鱼儿 2024-04-20 06:05 75阅读 0赞 > **?C++笔试强训** > > -------------------- > > * **博客主页:**[一起去看日落吗][Link 1] > * **分享博主的C++刷题日常,大家一起学习** > * **`博主的能力有限,出现错误希望大家不吝赐教`** > * **分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光** ?。 > > -------------------- > > ![在这里插入图片描述][047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center] ?? -------------------- #### 目录 #### * 选择题 * * ?第一题 * ?第二题 * ?第三题 * ?第四题 * ?第五题 * ?第六题 * ?第七题 * ?第八题 * ?第九题 * ?第十题 * 编程题 * * ?组队竞赛 * ?删除公共字符 ## 选择题 ## ### ?第一题 ### 以下for循环的执行次数是() for(int x = 0, y = 0; (y = 123) && (x < 4); x++); A. 无限循环 B. 循环次数不定 C. 4次 D. 3次 * for循环的组成 for(初始化部分 ;条件判断 ; 调整部分)\{ //循环语句部分 \} > **根据条件判断,当x为0 1 2 3 的时候会进行循环,所以这道题的`正确答案是4次,选C`** -------------------- ### ?第二题 ### 以下程序的运行结果是() #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就会停止,第一个%s会把computer全部打印出来,而%5.3是什么意思呢? **这里来讲解一下:** %m.ns: m:输出字符串的宽度 n:左起截取目标字符串n个字符,并且是右对齐,补空格 当字符串长度 > n > m :此时m就失效了,只受n控制。 当n > 字符串长度 时:此时和%s作用一样 > **所以这道题的答案是`computer , com ,所以选B`** -------------------- ### ?第三题 ### 下列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 这道题是用main函数调用func函数,然后返回一个k值,k在for循环中会变化,这道题的本质就是看for循环循环了多少次! 初始化部分j初始化为-1,条件判断部分是j赋值为0,所以这个条件判断是恒为假的,所以不会进入到for循环中,所以k的值为0。 > **`这道题的答案是 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 这道题目就和有些人刚开始写代码的时候,喜欢吧if语句的括号省略掉,这就导致代码的可读性变差,这时候就需要我们来仔细寻找if和else #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; } 经过调整之后代码的可读性变高了,然后就可以做题了 看第一个if,当两个都为真的时候才会进下面,a初始化是等于1的,为真,b++是先用b比较再进行++,所以也是为真的,所以就会进入到第二个if语句,然后我们再进行判断 第二个if的语句是用逻辑或连接起来的,所以某一边为真即为真,前面已经b++了,所以b现在为3,所以b!=2,所以为真,**逻辑或 当第一个表达式为真是不会执行第二个表达式的**所以会直接打印abc的值 > **所以这道题只有b在初始化以后有改变,`所以这道题的答案为1 3 3 ,所以选D`** -------------------- ### ?第五题 ### 若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是() A. char B. int C. double D. float 这道题不同类型的表达式进行计算的时候会有类型的提升,表示范围小会自动提升到范围大的类型,char占一个字节,int占四个字节,double占八个字节,所以char类型和int类型会自动提升到double类型。 > **`所以这道题选C`** -------------------- ### ?第六题 ### 在int p\[\]\[4\] = \{ \{1\}, \{3, 2\}, \{4, 5, 6\}, \{0\}\};中,p\[1\]\[2\]的值是() A. 1 B. 0 C. 6 D. 2 这个题是定义了一个数组并且进行初始化,这里是个四行四列的数组,而且数组并没有完全初始化,所以没有初始化的地方默认是0,所以我们可以把数组写出来 1 0 0 0 3 2 0 0 4 5 6 0 0 0 0 0 所以p\[1\]\[2\]表示第二行第三列的元素 > **`所以这道题的答案是0 选B`** -------------------- ### ?第七题 ### 选择表达式 11|10 的结果(本题数值均为十进制)() A 11 B 10 C 8 D 2 这道题是计算表达式,将11 按位或 10 ,我们先要将十进制转换为二进制 11: 0000 1011 10: 0000 1010 按位或的计算方式为 有1则1,无1则0 所以 11|10 : 0000 1011 转换为十进制的话是 11 > **`所以这道题的答案是 11 ,选A`** -------------------- ### ?第八题 ### int fun(int a){ a^=(1<<5)-1; return a; } fun(21)运行结果是() A 10 B 5 C 3 D 8 这里看fun函数里面的表达式,我们来分步进行分析 ^= : a ^= b ; -> a = a ^ b 1 << 5 : 表示将1左移5位 0000 0001 -> 0010 0000 -> 32 所以 a ^ = (1<<5)-1 -> a ^ = 31; 所以 a = 21 ^ 31 21 : 0001 0101 31 : 0001 1111 异或的计算方式是 不同为1,相同为0 所以21 ^ 31 :0000 1010 -> 10 > **`所以这道题的答案是10, 选A`** -------------------- ### ?第九题 ### 若有定义语句:int year=1009,\*p=&year;以下不能使变量 year 中的值增至 1010 的语句是() A \*p+=1; B (\*p)++; C ++(\*p) D \*p++ A选项的\*优先级最高,所以是先对p解引用得到year的地址,然后+1,所以正确 B和C选项的区别是前置++和后置++的区别,但是他们都带了括号,所以也是先对p解引用,所以也能是year变为1010 D选项是因为后置++的优先级高于\*p,但因为是后置++,所以会先对p解引用,再对p进行++,所以对year的值没有改变 > **`所以这道题选 D`** -------------------- ### ?第十题 ### 下面关于"指针"的描述不正确的是() A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL B 32位系统下任何类型指针的长度都是4个字节 C 指针的数据类型声明的是指针实际指向内容的数据类型 D 野指针是指向未分配或者已经释放的内存地址 A选项 free释放掉一个指针内容的时候只是把指针指向的空间销毁,并没有把指针置空 B选项 32都是4字节,64为8字节 C选项 例如int指针指向的内容肯定是int类型的 D选项 野指针是指向未分配或者已经释放的内存地址 **造成野指针的原因:** * 在定义指针的时候没有进行初始化 * 在free掉指针以后没有置空 * 越界访问,就是超越作用域去访问指针 -------------------- ## 编程题 ## ### ?组队竞赛 ### 链接:[组队竞赛][Link 2] 牛牛举办了一次编程比赛,参加比赛的有3\*n个选手,每个选手都有一个水平值a\_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2 为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。 如样例所示: 如果牛牛把6个队员划分到两个队伍 如果方案为: team1:\{1,2,5\}, team2:\{5,5,8\}, 这时候水平值总和为7. 而如果方案为: team1:\{2,5,8\}, team2:\{1,5,5\}, 这时候水平值总和为10. 没有比总和为10更大的方案,所以输出10. ![请添加图片描述][ad35c2837a9e45d998ad1d4d8e1763c1.png] **解题思路:** 举例1: 5 2 8 5 1 5 首先对输入的数组进行排序, 1 2 5 5 5 8 分别取第一个和后两个 1 5 8 然后 2 5 5 为一组 中间值相加为10 举例2:2 5 1 4 3 7 6 9 8 排序 : 1 2 3 **4** 5 **6** 7 **8** 9 分组 1 8 9 2 6 7 3 4 5 中间值相加为 8+6+4=18 推到一个公式:arr.len-2\*(i+1) 拿例1来说:arr.len=6 n=2 for(i=0;i<n;i++) i=0,arr.len-2\*(i+1) =6-2=4 i=1,arr.len-2\*(i+1) =6-4=2 所以第三个数和第五个数相加 即 5+5 = 10 **代码如下:** #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { long long sum=0;//此处注意要long long 防止数过大,放不下 int n=0; cin>>n; vector<int> a; // vector创建一个int类型的数组 a.resize(3*n); //数组的长度为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 = sum + a[a.size() - 2*(i+1)]; } cout<<sum<<endl; } -------------------- ### ?删除公共字符 ### 链接:[删除公共字符][Link 3] 思路: 1. 将第二个字符串的字符都映射到一个哈西数组中,用来判断一个字符在这个字符串。 2. 判断一个字符在第二个字符串,不要使用删除,这样效率太低,因为每次删除都伴随数据挪动。这里可以考虑使用将不在字符添加到一个新字符串,最后返回新新字符串。 ![请添加图片描述][ef4a3762c0f34c64871efff1a2eb22ab.png] #include <iostream> #include <string> using namespace std; int main() { // 注意这里不能使用cin接收,因为cin遇到空格就结束了。 // oj中IO输入字符串最好使用getline。 string str1,str2; getline(cin,str1); getline(cin,str2); // 使用哈希映射思想先str2统计字符出现的次数 int hash[256] ={ 0}; for(int i=0;i<str2.size();i++) { hash[str2[i]]++; } // 遍历str1,str1[i]映射hashtable对应位置为0,则表示这个字符在 // str2中没有出现过,则将他+=到ret string ret; for(int i=0;i<str1.size();i++) { if(hash[str1[i]] == 0) { ret += str1[i]; } } cout <<ret<<endl; return 0; } [Link 1]: https://blog.csdn.net/m0_60338933?type=blog [047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/4be4291ed59040818096b61cfc2e3700.jpeg [Link 2]: https://www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b?orderByHotValue=1&page=1&onlyReference=false [ad35c2837a9e45d998ad1d4d8e1763c1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/f88e5c03acbb477395c6d6f9b72a9302.png [Link 3]: https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=85&&tqId=29868&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking [ef4a3762c0f34c64871efff1a2eb22ab.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/25008075d81b46908b50aca0b692dbb1.png
还没有评论,来说两句吧...