一共3个部分,第一部分是单选题,第二部分是多选题,第三部分是编程题
选择题大部分考操作系统和Linux知识,没复习,不会做
单选题第一题感觉出的有问题,没有正确答案,题目如下:
下面程序段运行结果是什么?()
int i=0;
int a[]={3,6,4,8,5,6};
do{
a[i]-=3;
}while(a[i++]<4);
for(i=0;i<6;i++)
{
printf("%d",a[i]);
}
选项:
A. 31556
B. 64856
C. 364856
D. 31523
我计算出来的答案是 031556。什么情况???
编程题
1、两个有序数组合并
题目描述:
有A、B两个有序数组,将B合并到A中。合并之后输出结果,以空格隔开
说明:
(1)初始化A和B的元素数量分别为m和n
(2)A有足够的空间来保存B中的元素
(3)默认升序
代码:
ms, ns = input().split(',')
m, n = int(ms.strip('m=')), int(ns.strip('n='))
A = list(map(int, input().split(','))) + [0] * n
B = list(map(int, input().split(',')))
i, j, k = m - 1, n - 1, m + n - 1
while i >= 0 and j >= 0:
if A[i] > B[j]:
A[k] = A[i]
i -= 1
else:
A[k] = B[j]
j -= 1
k -= 1
while j >= 0:
A[k] = B[j]
j -= 1
k -= 1
print(' '.join(map(str, A)))
2、最后剩下的数字
题目描述:
给定一个从1到n的整数列表,从第一个数字开始计数,遇到3的倍数时,将该数从列表中删除,直至列表末尾。
在剩下的数字中,从第一个数字开始,继续之前的计数值,同样遇到3的倍数时,删除该数。
循环上面的步骤,直到列表中只剩下一个数字。
根据指定的数字n,来判断最后剩下的数字是哪个。
输入描述
输入:5
过程:
第一步:1,2,(3),4,5
第二步:(1),2,4,(5)
第三步:(2),4
输出描述:
输出:4
注:这题是经典约瑟夫问题,之前没做过这种题。我做题的时候没有看懂题意。下面是我的理解:
(1)看完题目,我以为第一步走完后,第二步接着从下标0位置开始往后计数
(2)看完输入后,我以为第二步要先删除下标0位置,之后再往后计数
而题目中说了,第二步,继续之前的计数,意思是,第一步走完后,从最后一个删除的位置开始计数,依次再往后计数(循环计数)
真是佩服自己的理解能力???
这道题我做完之后很明显不能全部通过。下面给出正确解题过程:
(1)我们将上述问题建模为函数 f(n, m)
(2)首先,长度为 n 的序列会先删除第 m % n 个元素,然后剩下一个长度为 n - 1 的序列。那么,我们可以递归地求解 f(n - 1, m),就可以知道对于剩下的 n - 1 个元素,最终会留下第几个元素,我们设答案为 x = f(n - 1, m)。
(3)由于我们删除了第 m % n 个元素,将序列的长度变为 n - 1。当我们知道了 f(n - 1, m) 对应的答案 x 之后,我们也就可以知道,长度为 n 的序列最后一个删除的元素,应当是从 m % n 开始数的第 x 个元素。因此有 f(n, m) = (m % n + x) % n = (m + x) % n。
代码如下:
class Solution:
def lastRemaining(self, n: int, m: int) -> int:
def f(n, m):
if n == 0:
return 0
x = f(n - 1, m)
return (m + x) % n
return f(n, m)
print(Solution().lastRemaining(5, 3))