4.10晚华为笔试

题目一

输入几个字符串,保证输出字符串长度为8,如abc 123456789,输出12345678 90000000 abc00000.
输入:2 abc 123456789
2表示输入两个字符串,abc和123456789表示两个输入的字符串

思路:

即abc字符串长度小于8,那么后面就要补0使其长度等于8,123456789长度为9,那么就要将其进行切分,12345678为一个输出字符串,9作为一个新的字符串,因为其长度为1,所以我们要在后面补0使其长度为8,最后,将所有的转换后字符串按照从小到大的顺序进行输出。

代码:
nums=[i for i in input().split(' ')]
length=int(nums.pop(0))
res=[]
for i in range(length):
    if not nums[i]:continue
    elif len(nums[i])<=8:
        res.extend([nums[i]+'0'*(8-len(nums[i]))])
    elif len(nums[i])>8:
        m=0
        while 8*(m+1)<len(nums[i]):
            res.append(nums[i][8*m:8*(m+1)])
            m+=1
        res.append(nums[i][8*m:]+'0'*(8*(m+1)-len(nums[i])))
res.sort()
print(' '.join(res))

题目二

题意:输入一个字符串,字符串中有大括号小括号中括号,且保证都是有效括号,即不存在(()这种情况,同时每一个括号内都有一个或多个字母,括号还可以相互嵌套,每个括号的前面都有一个数字,如3(AB),表示ABABAB,最后我们将这个字符串展开后逆序输出。
例:输入abc3(A) 输出AAAcba
输入abc3(3(A)2(B)) 输出BBAAABBAAABBAAAcba

思路:

我最开始把这道题想简单了,只想了单个括号,以及未嵌套的情况,所以当我测试许久发现想错了,头就有点蒙,以至于最后也没搞出来。
下面的代码是牛客上一位大佬的思路,我自己又写了下,这个代码巧妙的运用了栈!!还有他巧妙的利用了有效括号的特点(这个我自己编的时候也想到了,就是没想到用栈保存数字,以及逻辑没有弄明白#-#,还是需要多写算法题)。

代码:
#全部代码皆是基于有效括号编写的
strs=input()
res=''
number=[]
for i in strs:
    if i.isdigit():	#这是个判断是否是数字的函数
        number.append(i)	#这里保存数字
    elif i==')':
        tmp=''
        thisnumb=int(number.pop())	#利用栈
        j=-1
        while j>-len(res):
            if res[j]!='(':	#将括号排除
                tmp+=res[j]
                j-=1
            else:
                break
        res=res[:j]+thisnumb*tmp[::-1]#更新res
    elif i==']':
        tmp=''
        thisnumb=int(number.pop())
        j=-1
        while j>-len(res):
            if res[j]!='[':
                tmp+=res[j]
                j-=1
            else:
                break
        res=res[:j]+thisnumb*tmp[::-1]
    elif i=='}':
        tmp=''
        thisnumb=int(number.pop())
        j=-1
        while j>-len(res):
            if res[j]!='{':
                tmp+=res[j]
                j-=1
            else:
                break
        res=res[:j]+thisnumb*tmp[::-1]
    else:
        res+=i

print(res[::-1])

题目三

m*n的矩阵,从A点到B点,矩阵里面每个数字代表海拔 只能上下左右走 只能走比当前位置的海拔高的地方,求有几条路径可以从A走到B
输入:
4 5
0 1 0 0 0
0 2 3 0 0
0 0 4 5 0
0 0 7 6 0
0 1 3 2
第一行表示矩阵四行五列,最后一行表示A(0,1)和B(3,2)

注?:

这个题我是后来做的,自己想的简单测试案例通过了,牛客网的测试案例就不知道了。另外,由于递归的不熟悉,我用了数组来解决我递归出入口不会的问题。看牛客网上好多人说的也差不多是这个递归,但是他们都说超时。

代码:
a=[int(i) for i in input().split(' ')]
m,n=a[0],a[1]
nums=[]
for j in range(m):
    nums.extend([[int(i) for i in input().split(' ')]])
node=[int(i) for i in input().split(' ')]
begin_x,begin_y,end_x,end_y=node[0],node[1],node[2],node[3]

result=0
def solution(nums,i,j):
    if i==end_x and j==end_y:
        result+=1
        return result
    if j>0 and nums[i][j-1]>nums[i][j]:
        solution(nums,i,j-1)
    if j<n-1 and nums[i][j+1]>nums[i][j]:
        solution(nums,i,j+1)
    if i>0 and nums[i-1][j]>nums[i][j]:
        solution(nums,i-1,j)
    if i<m-1 and nums[i+1][j]>nums[i][j]:
        solution(nums,i+1,j)
print(solution(nums,begin_x,begin_y))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值