C语言习题~day35
1.
int f(int x){
return ((x>2) ? x*f(x-1) : 3);
}
int i;
i=f(f(2))
执行如上函数后. i的值为()
A.30
B.无限递归
C.9
D.2160
先计算内层的f(2),因为 2 不大于 2,所以返回 3,即f(2)=3。
然后计算f(f(2))=f(3),对于f(3),因为 3 大于 2,所以返回3*f(2),即3*3=9,所以最终i=9。
2.
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}}
p[1][2]的值是()
A.1
B. 0
C.6
D.2
数组 p 中第二行实际存储的是 {3, 2, 0, 0} (因为每行都要填满 4 个元素,不足的用 0 补齐),所以 p[1][2] 的值是 0。
3.
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。假设
nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。- 返回
k
。/* 方法1 解题思路: 1. 从前往后遍历nums,找到val第一次出现的位置 2. 将val之后的所有元素整体往前搬移,即删除该val 3. nums中有效元素个数减少一个 循环进行上述操作,直到nums中所有值为val的元素全部删除完 时间复杂度:O(N^2) 空间复杂度:O(1) */ #if 0 int removeElement(int* nums, int numsSize, int val){ // while(1) { // 1. 在nums中找val出现的位置 int pos = 0; for(; pos < numsSize; ++pos) { if(nums[pos] == val) { break; } } // 2. 检测是否找到 if(pos == numsSize) break; // 3. 找到值为value的元素--将其删除 for(int j = pos+1; j < numsSize; ++j) { nums[j-1] = nums[j]; } numsSize--; } return numsSize; } #endif #if 0 /* 方法2: 解题思路: 1. 创建一个长度与nums相同的数组temp 2. 遍历nums,将nums中所有与val不同的元素搬移到temp中 3. 将temp中所有元素拷贝回nums中 时间复杂度: O(N) 空间复杂度: O(N) */ int removeElement(int* nums, int numsSize, int val){ // 1. 申请numSize个元素的新空间 int* temp = (int*)malloc(sizeof(int)*numsSize); if(NULL == temp) { return 0; } // 2. 将nums中非value的元素搬移到temp中---尾插到temp中 int count = 0; for(int i = 0; i < numsSize; ++i) { if(nums[i] != val) { temp[count] = nums[i]; ++count; } } // 3. 将temp中删除val之后的所有元素拷贝到nums中 memcpy(nums, temp, sizeof(int)*count); free(temp); return count; } #endif