荣耀笔试题_20220412

前言

笔试一共三道编程题,分数依次为100、200、300,需要按顺序依次完成,只有做完这一道题,才能进入下一道题,无法跳题,使用的是牛客网,允许跳出界面使用自己的IDE。

题目一:字符串分割

给定一系列的字符串,字符串的个数为N,每个字符串的长度不超过100。长度小于8的字符串用零补足,长度大于等于8的字符串,按8位位一组的形式不断分割,最后剩余部分用零补足。

输入:

第一行包括一个整数N和N个原始字符串。

输出:

第一行包括分割后的字符串按字典序从小到大排列。

输入示例:

2 abc 123456789

输出示例:

12345678 90000000 abc00000

思路:

这一题比较简单,只需要按照题目的描述做即可。

inp = input().split()
n = int(inp[0])
ls = []
for i in range(1, n+1):
    string = inp[i]
    while len(string) > 8:
        ls.append(string[:8])
        string = string[8:]
    ls.append(string + "0"*(8-len(string)))
ls.sort()
print(" ".join(ls))

题目二:蜜蜂采蜜

平原上,一群蜜蜂离开蜂巢采蜜,要连续采集5片花丛后归巢。
已知5片花丛相对蜂巢的坐标,请你帮它们规划一下到访花丛的顺序,以使飞行总距离最短。

输入:

以蜂巢为平面坐标原点的5片花丛A、B、C、D、E的坐标,坐标值为整数。

输出:

从出发到返回蜂巢最短路径的长度取整值,取整办法为舍弃小数点后面的值。

输入示例:

200 0 200 10 200 50 200 30 200 25

输出示例:

456

说明:

样例中的10个数,相邻两个分别为一组,表示一个花丛相对蜂巢的坐标:A(x1, y1)、B(x2, y2)、C(x3, y3)、D(x4, y4)、E(x5, y5),分表代表x1,y1,x2,y2,x3,y3,x4,y4,x5,y5。

说明:

本题实际上是一道旅行商问题(TSP),经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题。

常见的解法有暴力破解、深度优先遍历,动态规划等。

高级的解法有模拟退火算法,遗传算法,粒子群算法、神经网络等

思路一:

暴力破解,求出五片花丛所有可能的到访顺序(全排列),取飞行总距离最短的路径即可。

from math import sqrt, floor
from xmlrpc.client import MAXINT
inp = list(map(int, input().split()))
mincost = MAXINT
ls = [(inp[i*2], inp[i*2+1]) for i in range(5)]
matrix = [[0 for i in range(5)] for j in range(5)]
for i in range(5):
    for j in range(5):
        matrix[i][j] = sqrt((ls[i][0]-ls[j][0])**2 + (ls[i][1]-ls[j][1])**2)

def Perm(nums, begin, end):
    global mincost, ls, matrix, path
    if begin >= end:
        cost = 0
        for i in range(4):
            cost += matrix[nums[i]][nums[i+1]]
        cost = cost + sqrt((ls[nums[0]][0]**2) + (ls[nums[0]][1]**2)) + sqrt((ls[nums[-1]][0]**2) + (ls[nums[-1]][1]**2))
        if cost < mincost:
            path = nums
            mincost = cost
        return
    else:
        for num in range(begin, end):
            nums[begin], nums[num] = nums[num], nums[begin]
            Perm(nums, begin+1, end)
            nums[begin], nums[num] = nums[num], nums[begin]

nums = [i for i in range(5)]
Perm(nums, 0, len(nums))
print(floor(mincost))

思路二:

采用深度优先遍历来寻找最短路径,并在遍历过程中通过不断剪枝来简化求解过程,广义上来讲也是全排列的一种。

from math import sqrt, floor
from xmlrpc.client import MAXINT

def DFS(u, cnt, cost):
    global mincost, matrix, visited
    if cost > mincost:
        return
    if cnt == 6:
        cost = cost + sqrt((ls[u][0]**2) + (ls[u][1]**2)) + sqrt((ls[0][0]**2) + (ls[0][1]**2))
        if cost < mincost:
            mincost = cost
    visited[u] = 1
    for v in range(6):
        if not visited[v]:
            DFS(v, cnt+1, cost + matrix[u][v])
    visited[u] = 0

inp = list(map(int, input().split()))
mincost = MAXINT
visited = [0 for i in range(6)]
ls = [(inp[i*2], inp[i*2+1]) for i in range(5)]
ls.insert(0, (0, 0))
matrix = [[0 for i in range(6)] for j in range(6)]
for i in range(6):
    for j in range(6):
        matrix[i][j] = sqrt((ls[i][0]-ls[j][0])**2 + (ls[i][1]-ls[j][1])**2)

DFS(0, 1, 0)
print(floor(mincost))

惨痛经历

因为邮件上写着系统开放时间为18:00-21:00(不同于美团写着笔试时间为16:00-18:00),所以我习惯性得以为笔试时间为三个小时,当我悠哉游哉地把第二题做完返回系统时,笔试已经结束了,因此只提交了第一题,直接人麻了。。。所以,各位小伙伴无论是在比赛还是在测试,一定先看好时间!!!当然,对于秒AK的大佬来说,时间根本不是事,那就当我没说。

凉梦空间

欢迎你进入我的个人博客网站参观交流:https://www.liangmeng.xyz
在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嵌入式C开发人员是负责设计和开发嵌入式系统软件的专业人员。他们需要熟练掌握C语言和嵌入式系统的特性,以及硬件平台和相关工具的使用。以下是我认为嵌入式C开发人员的最好的10道笔试题: 1. 解释嵌入式系统的概念,并给出一个应用嵌入式系统的例子。 2. 嵌入式系统与通用计算机系统有何区别?请列举至少三点。 3. C语言中的指针是什么?请解释指针的作用和用法,以及指针与数组之间的关系。 4. 嵌入式系统中的中断是什么?请解释中断的概念和工作原理,并说明中断在嵌入式开发中的重要性。 5. 请编写一个函数,用于检查一个给定的字符串是否为回文。 6. 嵌入式系统的存储器分为哪些类型?请列举各种类型的存储器,并简要描述它们的特点和用途。 7. 请编写一个程序,用于计算给定数组中的最大值和最小值。 8. 请解释嵌入式系统中的定时器是什么?请描述定时器的工作原理,并举例说明定时器在嵌入式开发中的应用场景。 9. 请解释嵌入式系统中的SPI总线是什么?请描述SPI总线的工作原理,并说明SPI总线在嵌入式系统中的应用。 10. 嵌入式系统的调试和测试有何挑战?请列举几个常见的调试和测试技术,并简要描述它们的优缺点。 以上这些问题可以考察嵌入式C开发人员的基本知识和实际应用能力,涵盖了嵌入式系统的各个方面。这些题目不仅要求考生对相关概念和技术有清晰的理解,还需要具备一定的编程能力和解决问题的能力。通过回答这些题目,能够对嵌入式C开发人员的能力和潜力进行初步的评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉丶梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值