jo

135 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第N天,点击查看活动详情 案是 11 ,选A

💦第八题 int fun(int a){ a^=(1<<5)-1; return a; } 1 2 3 4 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掉指针以后没有置空 越界访问,就是超越作用域去访问指针 编程题 🔥组队竞赛 链接:组队竞赛

牛牛举办了一次编程比赛,参加比赛的有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.

解题思路:

举例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 #include <alg 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19