做了华为的三道编程题,以下是题解:
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]])))