小米软件开发岗2021.09.01笔试记录

一共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))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值