华为机试支持python吗_4.10华为暑期实习生机试题目,python解答

第一题是给一个字符串,然后按照次数和ascii码的顺序,循环输出。比如输入eeefffggh,由于ascii的大小,e

'efgh'  + 'efg'   +  'ef'   =  'efghefgef'。字符串中可包含数字和大小写英文字母。

思路是先用dict统计个数,然后将所有可能出现的字符放在一个数组里,维护起来,

Whole = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'

'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',

'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i',

'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',

'y','z']

在dict中没有的就直接删除,然后再输出。有的话,那么将字典中的该字符的个数-1。直到字典中所有字符的个数均为0。

然而AC了77.78%,然后报超时,应该是算法复杂度太高吧。

#coding=utf8

x = raw_input()

def Not_Null(dic): #根据字典中所有键值的和是否为0,判断dict是否为空

sum = 0

for i in dic.values():

sum += i

if sum !=0: return True

else:

return False

leng = len(x)

dic = {}

for i in range(leng):

if x[i] not in dic:

dic[x[i]] =1

else:

dic[x[i]] +=1

Whole = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'

'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',

'U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i',

'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',

'y','z']

res = ''

to_remove=[]

while (Not_Null(dic)):

for cha in Whole:

if cha not in dic or dic[cha] == 0:

to_remove.append(cha)

else:

dic[cha] -=1

for d in to_remove:

Whole.remove(d)

for cha in Whole:

res += cha

to_remove = []

print res

第二题是给一个数组,每个数字代表从数字的坐标的位置最多能前进的位数(比如[2,a,b],则从这里开始,可以走1步到a,也可以走两步到b),求到数组的末端所需要的最少的步数。

如:[2,3,2,1,2,1,5],最短的步骤是 2->2->2->5,或者2->3->2->5,都需要3步,所以输出3。

这一题用的是DFS回溯法写的,AC了。在开始做题的时候,想到可以从后往前思考, 应该是动态规划的思想,但没想出来。幸亏数组没有太长导致溢出。

#coding=utf8

N = int(raw_input())

num = []

for i in range(N):

num.append(int(raw_input()))

SUM = N - 1 #比如有7个数,则累加和是6

min_count = 9999999 #在dfs中被当做全局变量。

count = 0

def dfs(SUM,num,index,step):

global min_count

if SUM == 0:

if step <= min_count:

min_count = step #终止并赋值

return

if SUM < 0:

return #减多了,直接返回

else:

x = num[index]

for i in range(1,x+1):

if index + i <= len(num)-1: #判断是否直接越界。

SUM -= i

index += i

step += 1

dfs(SUM,num,index,step)

SUM += i #在每一轮循环后,要退回去,回溯法!

index -= i

step -= 1

dfs(SUM,num,0,0)

print min_count

第三题,大数相乘。今年华为3.22机试的原题。。由于今天刚刚刷过,所以电脑里有源代码,就直接复制了。然后AC

参考的是  https://blog..net/u010983881/article/details/77503519 的方法二

num1 = raw_input()

num2 = raw_input()

sign1 = 1

sign2 = 1

if num1[0] == '-':

sign1 = -1

num1 = num1[1:]

if num2[0] == '-':

sign2 = -1

num2 = num2[1:]

leng1 = len(num1)

leng2 = len(num2)

ans =[0 for i in range(leng1 + leng2)]

for i in range(leng1):

for j in range(leng2):

mul = int(num1[i]) * int(num2[j])

ans[i+j+1] += mul

for i in range(leng1+ leng2 - 1, -1, -1):

if ans[i] >= 10:

ans[i-1] += ans[i] / 10

ans[i] = ans[i] % 10

res = ""

for bit in ans:

res += str(bit)

num_res = int(res) * sign1 * sign2

print str(int(num_res))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值