360秋招2020届笔试编程题(2019.8.15)--Binrry(冰蕊)

本文解析了两道算法题:一是计算由正方体堆叠形成的立体图形的表面积;二是求解两个m进制数在重新排列后相加的最大可能值。文章提供了核心思路和详细代码,强调了读懂题目、拆解问题和优化循环的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:

  • 题目描述
  • 将长N*M厘米的矩形区域划分成N行M列(每行每列的宽度均为1厘米),在第i行第j列的位置上叠放Ai,j个边长为1厘米的正方体(1≤Ai,j≤100),所有正方体就组成了一个立体图形,每个正方体六个面中的一部分会被其它正方体遮挡,未被遮挡的部分的总面积即为该立体图形的表面积,那么该立体图形的表面积是多少平方厘米?
  • [输入] 第一行包含两个整数N和M,1≤N,M≤1000。 接下来N行,每行包含M个整数,第i行的第j个整数表示Ai,j。
  • [输出] 输出表面积的大小。
  • [样例输入]
    2 2
    2 1
    1 1
  • [样例输出]
    20

核心思路

  1. 先理解题意,第二行第一个的数字是指在0行0列上有几个正方题叠加。
  2. 通过逐一的计算表面积,即一个位置上的表面积等于有几个正方体6-2遮挡面。
  3. 用两个for循环,外层为i~N,内层为j~M;当i=0且j=0时,总面积即此位置上的总面积;当i=0或j=0时,除了加上之前的表面积和此位置上的表面积,还应减掉两个位置互相遮挡的面积;还有一种情况是不在i且不在j轴上位置应去掉跟i-1,j-1相贴的遮挡面。

详细代码:
在这里插入图片描述

举一反三
点此可直达题目: LeetCode 892. 三维形体的表面积
参考答案
在这里插入图片描述

总结归纳

  1. 一定要读懂题目!一定要读懂题目!一定要读懂题目!
  2. 把整个区域的总表面积问题拆解成求一个个位置上的表面积之和
  3. 尽量减少多个for循环,以降低时间复杂度。
  4. 笔试时没想明白的题笔试后一定要去查问并解决。

第二题:

  • 题目描述
  • 在一个古老的国度,这个国家的人并不懂得进位,但是对取模情有独钟,因此诞生了一个经典的问题,给出两个在m进制下含有n位的数字,你可以分别将这两个数各位上的数字重新排列,然后将两个数按位对应相加并分别对m取模,这样显然可以得到一个新的m进制下的n位数(可能存在前导0),但是这个结果是不唯一的,问题来了,按照这样的操作,能够得到的最大的m进制下的数字是多少呢。
  • [输入] 输入第一行包含两个正整数n,m分别表示数字含有n位,和在m进制下。(n,m≤100000)输入第二行和第三行分别包含n个整数,中间用空格隔开,每个整数都在0到m-1之间。每行第i个数表示的是当前数第i位上的数字。
  • [输出] 输出包含n个数字,中间用空格隔开,表示得到的最大的数字,从高位到低位输出,如6在2进制下输出3位的结果是1 1 0。
  • [样例输入]
    5 5
    4 4 1 1 1
    4 3 0 1 2
  • [样例输出]
    4 4 3 3 2

核心思路

  1. 将n个数字由多变少,用m位数组存储,如num1[4]=2;num1[1]=3;num2[0]=1;num2[1]=1等等。
  2. 用两个for循环,外层for由m-1到0表示两组数的和;内层for由0到m-1遍历num1数组。
  3. 当num1数组取j时,若要num2数组取k且(j+k)%m=i;则k=(i-j+m)%m以防i小于j的情况被忽略。
  4. 当(j+k)%m=i且num1[j]>0且num2[k]>0,比较num1[j]和num2[k]的大小,消去较小的值并把此值放入num3[i]中记录两组数的和。
  5. 当执行完一个内循环,i的个数已确定,此时可以直接打印,注意空格,设置count++,当打印最后一个数是不再打印空格。

详细代码
在这里插入图片描述

总结归纳

  1. 虽然有n个数字,但它们的范围都是0~m-1,即有用的数字只有0~m-1。
  2. 在m进制下,最大数字为m-1,所以应先找出m-1的解,再依次递减。
  3. 尽量减少多个for循环,可用两个已知值通过数学算式求出第三个值。
  4. 最重要的是做题时,不应该想了很多种解决方案,徘徊在方法里却没有实现任一种。应想通解题思路,再去代码实现。再去多找类似提醒去巩固。

求:有没有遇到上面两道类似的题型可以留言哦,大家一起探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值