华为OD机试题

1.输入正整数T,输出T可以由连续自然数的和表示的所有情况及其数量。
如输入:9
输出:
9=9
9=4+5
9=2+3+4
Result=3
解释:9可以由3种形式的连续自然数的和表示,Result为3。
2.第一行输入一串由逗号隔开的数字,第二行输入一个整数。若该整数可以由第一行的连续数字的和表示,输出连续数字的最大数量;若不能表示,输出-1
如输入:
2,1,3,4,2,3,1,5,7
12
输出:5
解释:第一行的连续数字中:2+1+3+4+2=12,个数为5;3+4+2+3=12,个数为4;5+7=12,个数为2。其中5最大,输出5。
输入:
1,2,3,4
20
输出:-1
解释:20不能由第一行连续数字的和表示,输出-1
3.(类似于迷宫吧,不会)两人野外聚餐:输入m行n列二维数组,只包含0,1,2,3。
0:表示可通行;
1:表示障碍物,不可通行;
2:(数组中只有两个2)一个表示小华所处位置,另一个表示小为所处位置;
3:表示聚餐地点(个数>=1)。
输出两人能够到达的聚餐地点的最大数目。
如输入:
4   5
2 1 1 0 3
0 1 1 2 1
0 3 0 0 1
1 1 0 1 1
输出:2
解释:4  5表示4行5列,而后是二维数组。输出2表示两人都可以到达数组中两个3的位置。
过了1、2题所有例,第3题耍赖过了一半,算不得好汉。。。
#笔试题目##华为#
全部评论
怎么个耍赖法?
1 回复
分享
发布于 2021-12-21 23:10
做到这个程度,算不上大佬,好汉还是算的
点赞 回复
分享
发布于 2021-03-29 17:07
联易融
校招火热招聘中
官网直投
楼主可以说下大致思路吗?就是逐个数字遍历?
点赞 回复
分享
发布于 2021-04-01 19:36
好汉能给一下第二题的代码吗?或者输入是怎么处理的啊
点赞 回复
分享
发布于 2021-05-07 17:46
老汉最后怎么样?
点赞 回复
分享
发布于 2021-05-08 20:37
public class Test3 {     public static void main(String[] args) {         int[] test = new int[]{2,1,3,4,2,3,1,5,7};         int target = 12;         int max = -1;         for(int i=2;i<test.length;i++){             max = Math.max(max,xx(test,target,i));         }         System.out.println(max);     }     public static int xx(int[] num,int target,int k){         int temp = 0;         for(int i=0;i<num.length-k;i++){             int index = i;             for(int j=0;j<k;j++){                 temp+=num[index++];             }             if(temp == target){                 for(int x = i;x<index;x++){                     System.out.println(num[x]);                 }                 return k;             }         }         return -1;     } }
点赞 回复
分享
发布于 2021-11-20 21:17
用连续自然数之和来表达整数
点赞 回复
分享
发布于 2022-05-23 20:11
第三题怎么耍赖的?
点赞 回复
分享
发布于 2022-06-14 21:16
求第一题和第三题 用python怎么解
点赞 回复
分享
发布于 2022-07-06 22:39
第三题试着写了一下,不知道对错 import sys import copy m,n=list(map(int,sys.stdin.readline().strip().split())) num=[] for i in range(m):     num.append(list(map(int,sys.stdin.readline().strip().split()))) print(num) def dfs(x,y,num,res):     if num[x][y]==1:         return     if num[x][y]==4:         return     if num[x][y]==3 and [x,y] not in res:         res.append([x,y])         dfs(x,y,num,res)         return     direction=[(1,0),(-1,0),(0,1),(0,-1)]     num[x][y]=4     for dx,dy in direction:         newx,newy=dx+x,dy+y         if newx>=0 and newx<m and newy>=0 and newy<n:             dfs(newx,newy,num,res)     return res res=[] for i in range(m):     for j in range(n):         if num[i][j]==2:             numcopy=copy.deepcopy(num) #复制一份,第一个dfs的时候防止重复循环会把走过的格子改成4             res.append(dfs(i,j,numcopy,[])) count=0 for i in res[0]:     if i in res[1]:         count+=1 print(count)
点赞 回复
分享
发布于 2022-10-25 23:30 江苏
第三题又鼓捣了一下,整了个并查集解法,写不下分两拨 import sys m,n=list(map(int,sys.stdin.readline().strip().split())) road=[] for i in range(m):     road.append(list(map(int,sys.stdin.readline().strip().split()))) fa=[i for i in range(m*n)] def find(x):     global fa     if fa[x]==x:         return x     else:         fa[x]=find(fa[x])         return fa[x] def union(x,y):     fa[find(x)]=find(y) def isnear(x,y,n):     hangx=x//n     hangy=y//n     liex=x%n     liey=y%n     return (hangx==hangy and abs(liex-liey)==1)&nbs***bsp;(liex==liey and abs(hangx-hangy)==1) island=[] people=[] restrant=[]
点赞 回复
分享
发布于 2022-10-29 12:04 江苏
for i in range(m):     for j in range(n):         if road[i][j]!=1:             island.append(i*n+j)         if road[i][j]==2:             people.append(i*n+j)         if road[i][j]==3:             restrant.append(i*n+j) print(island) for i in range(len(island)):     for j in range(i+1,len(island)):         if isnear(island[i],island[j],n):             union(island[i],island[j]) print(island) print(fa) res=[] for i in people:     onepeople=[]     for j in restrant:         if find(i)==find(j):             onepeople.append(j)     res.append(onepeople) print(len(list(set(res[0])&set(res[1]))))
点赞 回复
分享
发布于 2022-10-29 12:05 江苏

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 14:57
点赞 评论 收藏
转发
6 65 评论
分享
牛客网
牛客企业服务