Day10?
一、选择题
1、求函数返回值,传入 -1 ,则在64位机器上函数返回( )
A:
死循环
B:
64
C:
32
D:
16
2、读代码选结果( )
?
A:
1
B:
2
C:
32
D:
死循环,没结果
3、下述赋值语句错误的是( )
A:
a = (b = (c = 2 , d = 3))
B:
i++
C:
a/b = 2
D:
a = a < a + 1
4、若有 int w=1, x=2, y=3, z=4; 则条件表达 w < x ? w : y < z ? y : z 的值是( )
A:
1
B:
2
C:
3
D:
4
5、以下程序运行后的输出结果是( )
A: 0,0
B: 0,1
C: 1,0
D: 1,1?
?二、编程题
描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足?0 \le n \le 10000≤n≤1000
进阶:空间复杂度?O(1)O(1),时间复杂度?O(1)O(1)
示例1
输入:1,2
返回值:3
示例2
输入:0,0
返回值:0
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
示例 2:
输入:nums = [1,1]
输出:[2]
?
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
题解:
一、选择题
1
、
答案解析:
正确答案:
C
x=x&(x-1)
这个表达式执行一次就会将
x
的
2
进制中最右边的
1
去掉,在
x
变成
0
之前,表达式能执行几次,就去掉几个
1
,所以 这个代码实现了求一个有符号整数二进制补码中1
的个数的功能,我们知道
-1
的补码是全
1
,而
int
类型
4
个字节
32
位,选
C ?
2
、
答案解析:
正确答案:
D
此题一个关键,有符号数右移运算高位是补符号位的,负数的符号位是
1
,所以
x
永远不会变为
0
,是个死循环
3
、
答案解析:
正确答案:
C
C
选项中
a/b
是表达式,表达式计算的结果是一个值不能做左值
4
、
答案解析:
正确答案:
A
w<x?w:(y<z?y:z)
加个括号应该就好理解了
w<x
为真,返回
w
,即表达式的值为
1
5
、
答案解析:
正确答案:
A
k=(n=b<a)&&(m=a);
这部分的执行顺序如下:先执行
n=b<a
部分,其中,关系运算符优先级高于赋值运算符,所以先算b<a,得到
0
,
n=0
赋值运算的结果将作为括号内表达式的结果,即
(n=b<a)&&(m=a)
转换成
(0)&&(m=a)
,
&&
运算前表达式为假,则后面的括号(m=a)
不运算,
m
值还是
0
,最后,
&&
的结果是
0
,即
k=0
二、编程题
1
、【答案解析】:
十进制相加思想:
15+07
, 先计算不考虑进位的相加结果
12
(因为
5+7
的不考虑进位的结果是
2
,遇
10
进位嘛),然后计算进位 5+7
进位是
10
,则
10
与
12
再次相加,得到
22
,进位为
0
,则计算到此结束。
这里使用二进制求和完成,思想类似,但是二进制计算相加和进位不需要使用
+
符号二进制相加思想:与十进制相同,先计算不考虑进位的相加结果( 0+0
得
0
,
1+1
进位得
0 ,
1+0
得
1
),使用异或可以取得; 然后计算相加的进位结果(同 1
的位置左移一位即可),使用相与后左移取得。
示例:
int Add(int num1, int num2)
{
while (num2 != 0)
{ //进位不为0则持续与相加结果进行相加
int tmp = num1 ^ num2; //得到每位相加不考虑进位的数据
num2 = (num1 & num2) << 1; //同1的位相加则会进位
num1 = tmp;
}
return num1;
}
2
、【答案解析】:
numsSize
大小的数组,其中每个元素的数据在
[1, numsSize]
区间之内,解法其实并不复杂,以数组元素的绝对值作为下标,将对应位置的数据置为负数,比如 0
号位置是
3
,则把
3
号位置的数据重置为负值,等到数组遍历重置完毕,只有缺失的这个数字对应的位置保留正数,其他出现过的数字位置都会是负数, 要注意不要重复设置负数,因为负负得正。
示例:
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
for (int i = 0; i < numsSize; i++)
{
if (nums[abs(nums[i]) - 1] > 0) nums[abs(nums[i]) - 1] = -(nums[abs(nums[i]) - 1]);
}
int* ret = (int*)malloc(sizeof(int) * (numsSize));
*returnSize = 0;
for (int i = 0; i < numsSize; i++)
{
if (nums[i] > 0)
{
ret[*returnSize] = i + 1;
*returnSize += 1;
}
}
return ret;
}