3月27日做了华为笔试,3道题2小时。当时没有拍照,现在凭记忆将题目和代码叙述一遍,方便后人。前面将把三道题分别列一下,供后来者自己做。在后面说明一下自己的写法

第一题:题目说的比较复杂,读懂题意之后大致是,9个字符一组,每组的第一个字符是标志位,后面8个字符是地址。如果标志位是0,地址逆序,标志位是1地址不变。输入说明:一个字符串,有多组字符,中间没有空格。输出说明:输出最后的地址,每组地址用空格隔开,最后一个输出不需要空格。时间:C/C++1秒其他2秒

第二题:简而言之就是TSP问题。蜂巢在坐标(0,0)的位置,有五处花丛,蜜蜂从蜂巢出发,要把五处花丛的花蜜采完再回到蜂巢,最短距离是多少。输入说明:一行输入,10个数分别是五处花丛的坐标(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5),用空格隔开。输出说明:输出最短距离,距离向下取整。时间:C/C++5秒其他10秒

第三题:切水果游戏。有一个40×50的方格,里面有n(1≤n≤36)个水果,每一刀可以横切,竖切以及左斜切与右斜切四种方式。想要切完所有水果,最少需要多少刀。输入说明:第一行是说过个数n,接下来的n行是水果的横纵坐标。输出说明:输出最少需要的刀数。(PS:原题有图,这里无图解释一下切割方式,横切就是所有x相同的水果可以一刀切完,纵切就是y相同,左斜切就是x-y相同,右斜切就是x+y相同)。时间:C/C++3秒其他6秒

下面是各题做法和思路:

第一题:题目说的比较复杂,读懂题意之后大致是,9个字符一组,每组的第一个字符是标志位,后面8个字符是地址。如果标志位是0,地址逆序,标志位是1地址不变。输入说明:一个字符串,有多组字符,中间没有空格。输出说明:输出最后的地址,每组地址用空格隔开,最后一个输出不需要空格。

解答:第一题很简单,9个一组得读取,判断第一个是0还是1即可。5分钟内即可AC。

# -*- coding:utf8 -*-
n = int(input())
strs = input()
for i in range(n):s = strs[9*i:9*i+9]  # 9个一组得读取if s[0] == '0':s = s[1:]s = s[::-1]  # 逆序else:s = s[1:]print(s, end=' ')  # 空格输出

第二题:简而言之就是TSP问题。蜂巢在坐标(0,0)的位置,有五处花丛,蜜蜂从蜂巢出发,要把五处花丛的花蜜采完再回到蜂巢,最短距离是多少。输入说明:一行输入,10个数分别是五处花丛的坐标(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5),用空格隔开。输出说明:输出最短距离,距离向下取整。

解答:一开始就想到了全排列之后贪心算法取最小,虽然觉得方法太low了,但是让我一下子写出蚁群之类的觉得记忆模糊就很纠结。后来发现这道题给了10秒的运行时间,妥妥的决定用全排列了。思路:先用全排列的方式获取蜜蜂访问5个花丛的所有可能顺序,之后计算每个路径长度取最小。

# -*- coding:utf8 -*-
from math import sqrt
line = input().strip().split()
n = list(map(int, line))
n = [int(i) for i in line]
nums = [[0,0], [n[0],n[1]], [n[2],n[3]], [n[4],n[5]], [n[6],n[7]], [n[8],n[9]]]
# 以下为插入的方式获取全排列的代码。没看过别人的,自己想到的。
# 后来看网上说,递归获取全排列更常见,有兴趣的可以自己去搜一下。
order = [[1]]
for i in range(2,6):lens = len(order)j = 0while j < lens:for k in range(i-1):tmp = order[j][:]  #order.append(tmp)order[-1].insert(k, i)order[j].append(i)j += 1
# 接下来是制作距离矩阵
dist = [[0] * 6 for i in range(6)]
for i in range(6):for j in range(6):if dist[i][j] == 0:dist[i][j] = sqrt((nums[i][0]-nums[j][0])**2 + (nums[i][1]-nums[j][1])**2)else:dist[i][j] = dist[j][i]
# 贪心算法取最小
minVal = 0
for path in order:sums = dist[0][path[0]]for i in range(4):sums += dist[path[i]][path[i+1]]sums += dist[path[4]][0]if minVal > sums or minVal == 0:minVal = sums
print(int(minVal))

第三题:切水果游戏。有一个40×50的方格,里面有n(1≤n≤36)个水果,每一刀可以横切,竖切以及左斜切与右斜切四种方式。想要切完所有水果,最少需要多少刀。输入说明:第一行是说过个数n,接下来的n行是水果的横纵坐标。输出说明:输出最少需要的刀数。(PS:原题有图,这里无图解释一下切割方式,横切就是所有x相同的水果可以一刀切完,纵切就是y相同,左斜切就是x-y相同,右斜切就是x+y相同)。时间:C/C++3秒其他6秒。

解答:当时用的贪心算法,只通过了70%,后来想到了动态规划算法,虽然没试过但是个人感觉应该可以AC。和LeetCode零钱兑换问题差不多的思路。评论中有人说时间复杂度很高。的确时间复杂度是4的n次方。我尝试了一下,n=15应该没问题,超过15时间就比较久了。期待有大佬给出更好的答案。

# -*- coding:utf8 -*-
# 40 * 50的方格
from random import randint
# 动态规划算法。对于一个点,四种切法去除被切除的点即可获得下一次的点集。加上1即可
def dp(points):if len(points) <= 1:return len(points)first = points[0]row = [i for i in points if i[0] != first[0]]cntRow = dp(row)col = [i for i in points if i[1] != first[1]]cntCol = dp(col)left = [i for i in points if i[2] != first[2]]cntLeft = dp(left)right = [i for i in points if i[3] != first[3]]cntRight = dp(right)return 1 + min(cntRow, cntCol, cntLeft, cntRight)# 贪心算法。假设只能选择一种方式切,选择刀数最少的
def greedyOne(points):x = [i[0] for i in points]y = [i[1] for i in points]l = [i[2] for i in points]r = [i[3] for i in points]return min(len(set(x)), len(set(y)), len(set(l)), len(set(r)))n = int(input())
points = []
for i in range(n):line = input().strip().split()x = int(line[0])y = int(line[1])l = y - xr = x + ypoints.append([x, y, l, r])
'''
# 此部分为随机获取点值,确定自己的动态规划算法是否最优
n = 15
for i in range(10):points = []for j in range(n):x = randint(0,40)y = randint(0,50)l = y - xr = x + ypoints.append([x, y, l, r])res1 = dp(points)res2 = greedyOne(points)print('dp is %d, greedy is %d'%(res1, res2))if res1 > res2:print(points)
'''

华为2019年3月27日实习生笔试题及解答相关推荐

  1. 雅思作文未来计算机的应用,2019年4月27日雅思大小作文点评及范文解析

    原标题:2019年4月27日雅思大小作文点评及范文解析 苏州环球教育杨俊麟老师为大家带来2019年4月27日雅思大小作文的点评及范文解析. A类小作文 [作文类型]柱状图 [作文题目]1. The b ...

  2. 梦幻西游手游服务器维护公告,《梦幻西游》手游2019年2月27日维护公告:梦幻狂欢月来临_ 《梦幻西游》手游官网-人人都玩,无处不在...

    亲爱的玩家朋友: 为保证服务器的运行稳定和服务质量,<梦幻西游>手游所有服务器将于2019年2月27日8:00停机,进行维护工作.预计维护时间为8:00-9:00.如果在预定时间内无法完成 ...

  3. 6月27日服务器例行维护公告,2019年06月27日维护公告

    原标题:2019年06月27日维护公告 亲爱的玩家: 为了保证服务器的稳定和服务质量,<大话西游2经典版>将于2019年06月27日(本周四)早上8:00停机,进行每周例行的维护工作,预计 ...

  4. 2020年3月25日阿里笔试题

    2020年3月25日阿里笔试题 题目描述一 python代码 题目描述二 求公差的python代码 处理上述情况的代码   仿佛人生总有一种魔咒,自己做的这场笔试题永远是最难的.不过今天的笔试题,真的 ...

  5. 2020年3月23日阿里笔试题

    2020年3月23日阿里笔试题 题目描述 题目分析   这是阿里的第二场笔试,本来觉得没啥好写的,一道排列组合,一道迷宫.没有什么发挥的空间.但是后来在和大家讨论的过程中,把这道题的公司给敲出来了,但 ...

  6. SpiderData 2019年2月27日 DApp数据排行榜

    以太坊(ETH)24小时活跃用户:10558,24小时交易额:24031.77 ETH,热门榜单前三:加密英雄(日活1533).IDEX(日活918).Theta Network(日活735): 柚子 ...

  7. #单机只打开一次窗口_[2019年11月27日]CCWOW单机版修复内容

    各位CCWOWER,单机版发布2个月以来,一直没有进行过功能性的更新,最近花了3天的空闲时间为单机版做的一些功能,同时发布32位单机版本,下面是更新日志: 2019-11-27系统 为没有单位属性的物 ...

  8. ccwow星期三服务器维护,【网络游戏】[2019年11月27日]CCWOW单机版修复内容_玩得好游戏攻略...

    各位CCWOWER,单机版发布2个月以来,一直没有进行过功能性的更新,最近花了3天的空闲时间为单机版做的一些功能,同时发布32位单机版本,下面是更新日志: 2019-11-27系统为没有单位属性的物品 ...

  9. 2019年4月27日 修改功能

    import osdef search(data): #查询print('查询功能%s'%data)ret=[]backend_data='backend %s'%datawith open ('te ...

  10. 2019年10月27日训练日记

    最近题变难了好多,做的题数也变少了,而且这些题自己独立出也变困难了不少,前两天做了道树形DP的题,看了好久才明白它的原理,怎么退出来的状态转移方程,的确是不太好想.题解有个地方一直没看明白,翻了好多篇 ...

最新文章

  1. ReMILO:使用短读和长读的参考辅助错配检测算法
  2. 云安全课程:云平台使用安全
  3. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
  4. 5G来了4G降速?负载均衡链路聚合器了解一下
  5. Ajax接触及对跨域的简单理解
  6. python笔记之if练习
  7. 亚马逊 OpenJDK 发行版 Corretto GA
  8. 关于安卓手机在微信浏览器中无法调起相机的原因
  9. 1.极限——例子_2
  10. 海康威视第一季度营收165亿元 净利润22.84亿元
  11. 流行的php面试题及答案
  12. CsharpVB教程下载
  13. 可视化:小型有向网络HTML自动生成器
  14. 少子寿命测试仪 硅片少子寿命测试系统美国Sinton WCT-120少子寿命测试仪
  15. xUbuntu安装笔记
  16. Linux中的基础指令
  17. 关于苏宁易购的好坏与网购的心酸苦逼史,有同感的请继续顶起
  18. [Linux] Bash中大括号和小括号的使用
  19. 报错:TypeError: Image data of dtype object cannot be converted to float
  20. linux生成相同文件名覆盖吗,去掉Linux中cp覆盖同名文件的提示

热门文章

  1. SRE运维工程师笔记-计算机基础
  2. c语言中用于获取字符串长度的函数是,C语言字符串长度
  3. 阿里巴巴实习生笔试研发工程师
  4. PS怎样删除文字成为背景颜色
  5. 用PS给证件照换底色
  6. token干什么用_token是什么意思(token的含义及使用方法)
  7. android 快速开发,GitHub - limedroid/XDroid: 轻量级Android快速开发框架
  8. Android网页字体缩放控件,Zoom Text Only插件下载-chrome网页字体缩放插件Zoom Text Only下载v1.5.4 官方版-西西软件下载...
  9. 响应式网站建设的优缺点
  10. 单臂路由实现VLAN间通信