华为实习编程测试题解(2018-03-21)

        做了华为的三道编程题,以下是题解:

1.在字符串中找出连续最长的数字串
题目大意:输入一个字符串,输出最长的连续数字字符串,并输出其长度,中间用逗号隔开。比如输入123abc,输出123,3

另外,要求数字串中每个数字不要求按顺序,比如123ab2357中最长数字串应该是2357;而且,如果有多个最长串,则输出最后一个,比如123ab234,则答案输出是234,3。

解题思路:

首先用一个数组dp来保存当前位置的最大连续数字串,只需遍历输入字符串一次就可以得到dp,然后遍历dp,找到最大值的最后出现的位置,然后找到相应的字符串即可,代码如下:

# -*-coding:utf-8 -*-
while True:
    try:
        s = raw_input()
        ls = len(s)
        dp = [0 for i in range(ls)]
        for i in range(ls):
            if 57 >= ord(s[i]) >= 48:
                if i - 1 >= 0:
                    dp[i] = dp[i - 1] + 1
                else:
                    dp[i] = 1
        ans = max(dp)
        if ans==0:print ''+','+'0'
        else:
            tmp=''
            res=0
            for k in range(ls):
                if dp[k]==ans:
                    res=k
            tmp+=s[res-ans+1:res+1]
            print ''.join(tmp)+','+str(ans)
    except:
        break
2.字节流解析

题目大意:

/*
输入:

字节数组长度uiIutputLen为3;

字节数组aInputByte[3]为{0x62, 0x80,,0x00},对应二进制为“0110 0010 ,1000 0000,0000 0000”;

解析数值个数uiElementNum为2;

数值[0]的值占4个bit,即astElement[0].uiElementLength = 4;

数值[1]的值占5个bit,即astElement[1].uiElementLength = 5;

输出:

数值[0]的值为6,二进制为“0110”,即astElement[0].uiElementValue = 6;

数值[1]的值为5,二进制为“0010 1”,即astElement[1].uiElementValue = 5。

题解:先依次将16进制字节进行转化成二进制,如果不满8位的前缀用0凑齐8位,并保存进一个字符串,转化注意进制标识符;然后根据astElement数组中要求的每个数值占几个bit,截取二进制位数,并将其转化为十进制输出。

代码如下:

#-*-coding:utf-8 -*-
def solve(n,abyte,t,res):
    s=''
    k=0
    for i in range(n):
        er=str(str(abyte[i])[2:])
        tmp=bin(int(er,16))
        o=tmp[2:]
        if(len(o)<8):
            s+='0'*(8-len(o))+tmp[2:]
        else:
            s+=o

    for i in range(t):
        w=res[i]
        ep=''
        e=w
        while(e>0):
            if(s[k]!=''):
                ep+=s[k]
                e-=1
            k+=1
        sol=0
        for u in ep:
            sol+=int(u)*(2**(w-1))
            w-=1
        print sol
if __name__ == '__main__':
    n=int(raw_input())
    abyte=map(str,raw_input().split(' '))
    res=[]
    t=int(raw_input())
    for i in range(t):
        a=int(raw_input())
        res.append(a)
    solve(n,abyte,t,res)
3.大整数相乘

题目大意:给定两个大整数A,B,对其进行求乘积。

题目思路:可以将A和B分别用数组进行存储,然后对两个数组按照乘法规则进行计算,注意进位,然后存入另一个数组,最后输出,注意正负号。

#-*-coding:utf-8 -*-

s1=raw_input()
s2=raw_input()
d1=1
d2=1
if(s1[0]=='-'):
    d1=-1
    s1=s1[1:]
if(s2[0]=='-'):
    d2=-1
    s2=s2[1:]
s=''
ls1=len(s1)
ls2=len(s2)
s1=s1[::-1]
s2=s2[::-1]
dp=[0]*(ls1+ls2)
for i in range(ls2):
    g=0
    for j in range(i,i+ls1):
        res=int(s2[i])*int(s1[j-i])
        dp[j]=dp[j]+res+g
        g=dp[j]//10
        dp[j]=dp[j]%10
    dp[j+1]=dp[j+1]+g
if(d1*d2==-1):
    s='-'
print s+str(int(''.join([str(x) for x in dp[::-1]])))


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值