2022.1.22 华为OD-机试题

总共3道编程题,我还是考这种题考少了,机考的时候有点懵,考完回头看才发现自己太菜了哈哈哈,不多说上代码(回来之后重新做的)

  • 第1题(还没写完???)

   https://blog.nowcoder.net/n/d906173636514377a3438623ae3bf7a2

给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下:
每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。
允许通过向左或向右整体循环移动每行元素来改变各元素在行中的位置。 比如:
[1,0,1,1,1]向右整体循环移动2位变为[1,1,1,0,1],二进制数为11101,值为29。
[1,0,1,1,1]向左整体循环移动2位变为[1,1,1,1,0],二进制数为11110,值为30。
输入描述:
输入的第一行为正整数,记录了N的大小,0 < N <= 20。
输入的第2到N+1行为二维矩阵信息,行内元素半角逗号分隔。
输出描述:
矩阵的最大值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution:
    def get_sum(self, n, list_num):
        sum1 = 0
        for idx, value in enumerate(list_num):
            if value == 0:
                sum1 += 0
            else:
                sum1 += value * 2 ** (n - 1 - idx)
        return sum1
 
    def sum_list1(self, nums):
        n = int(nums[0])
        sum_max = 0
        nums[:] = nums[1:]
        for str in nums:
            list_num = [int(s) for s in str.split(",")]
            max_num = self.get_sum(n, list_num)
            for i in range(1, n):
                # 每次左移动一位
                list_temp = list_num[i:]+list_num[:i]
                # 获取移位后的和
                temp = self.get_sum(n, list_temp)
                # 判断最大值
                max_num = max(max_num, temp)
            # print(list_num, max_num)
            # 计算每行矩阵和
            sum_max += max_num
        return sum_max

  

 以上是比较笨的办法,有一个更好的 https://blog.csdn.net/cxh21627/article/details/125002305

1
2
3
4
5
6
7
8
9
10
11
def sum_list2(self, nums):
    n = int(nums[0])
    nums[:] = nums[1:]
    sum_max = 0
    for num in nums:
        temp = num.replace(",", "")
        max_num = int(temp, 2)
        for i in range(1, n):
            max_num = max(max_num, int(temp[i:]+temp[:i], 2))
        sum_max += max_num
    return sum_max 
  • 第2题
https://leetcode-cn.com/circle/discuss/fhOTlt/
某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。

仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0<x<1000,0<y<1000。同时存在非法坐标,如(01,1)、(1,01),(0,100)属于非法坐标。
设定探险队总部的坐标为(0,0),某位置相对总部的距离为:xx+yy。
若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
若记录仪中的坐标都不合法,输出总部坐标(0,0)。
备注:不需要考虑双层括号嵌套的情况,比如sfsdfsd((1,2))。
输入描述:
字符串,表示记录仪中的数据。
如:ferga13fdsf3(100,200)f2r3rfasf(300,400)
输出描述:
字符串,表示最远足迹到达的坐标。
如: (300,400)
示例1
输入
ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
输出
(5,10)
说明
记录仪中的合法坐标有3个: (3,10), (3,4), (5,10),其中(5,10)是相距总部最远的坐标, 输出(5,10)。
示例2
输入
asfefaweawfaw(0,1)fe
输出
(0,0)
说明:记录仪中的坐标都不合法,输出总部坐标(0,0)
复制代码
def func2(info):
    length = len(info)
    max_index = "(0,0)"
    i = 0
    while i < length:
        max_dis = 0
        # 一对对 查找()位置
        l_index = info.find("(", i)
        r_index = info.find(")", i)
        i = r_index + 1
        if l_index >= 0 and r_index >= 0:
            temp = info[l_index + 1:r_index].split(",")
        else:
            break
        if temp[0][0:1:] != '0' and temp[1][0:1:] != '0':
            x = int(temp[0])
            y = int(temp[1])
            if 0 < x < 1000 and 0 < y < 1000 and (x ** 2 + y ** 2) > max_dis:
                max_dis = (x ** 2 + y ** 2)
                max_index = "(" + temp[0] + "," + temp[1] + ")"
    return max_index
复制代码

 

  • 第3题

https://blog.csdn.net/Angel_Emma/article/details/100546831
假设有一组非负整数,对数据元素重新排列,使其构成的整数最大,输出该整数。如输入11,20,3,7.输出732011
我的机考题是输入“90 12 123 78” 这种
复制代码
def func3(mock_input):
    nums = mock_input.split(" ")
    length = len(nums)
    # 将所有nums[i]转换为int
    # nums = list(map(int, nums))
    for i in range(length):
        for j in range(i + 1, length):
            if nums[i] + nums[j] < nums[j] + nums[i]:
                temp = nums[i]
                nums[i] = nums[j]
                nums[j] = temp
  #针对 0 0情况,应该输出0
  result = str(int("".join(nums)))
  return result

复制代码

 



posted @   huangyn  阅读(9942)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示