荣耀社招笔试

2023-10-30

荣耀社招笔试题纪录篇

原文链接荣耀社招笔试题

十一放假回家参加了荣耀社招笔试,两道算法题,解析仅供参考

第一题:旋转矩阵

题目描述:

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请
你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?

示例 1:

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]
示例 2:

给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

分析

作为数学系出生的学生,对矩阵的操作应该有所印象,本题的本质在于考察对于矩阵的基本运算能力,例如矩阵转置、内积、点积以及矩阵的迹、特征值和特征向量等等,这是解决本题以及类似题的关键,也是刷题过程中从仅仅刷题到总结经验的思考过程,发现自己目前欠缺的正是这个思考过程。

记得很清,在18年找实习的时候,人生中第一次求职面试公司是阿里,面试官在结束面试时给我说,“任何语言你应该看其本质,你是数学系的,你应该知道事物的本质,框架都是基于语言的本质搭建的”,这句话当时记得很清,很清楚其中的分量,很遗憾当时不能立即运用到实际开发学习之中,因为自己一直缺乏深入的思考,正如姜同学所说,“你在学校时候虽然也跟我们一起学,当你自己思考的太少了”,正因如此,走出学校去实习开始那一刻,和大部队渐行渐远,导致如此境地。思考,是突破瓶颈追求进步的必经之路,实操是检验思考的唯一标准,是及时反馈思考结果的不二法门。

回到本题,矩阵运算,就是通过转换操作把一个矩阵转为另一个矩阵,力扣原题是顺时针转换90度,荣耀笔试是顺时针转换m次,透过现象看本质,转换m次就是转换m个90度,循环即可。笔者当时在做这道题时观察转换后坐标和原坐标的关系,找出共同之处,这是思考欠缺的点,应该从更高的维度思考本题,基于做题的敏感性,联想矩阵的特征,n阶亦有诸多特征。

代码解析

"""
@Auth : Mario
@Date : 2021/10/4 21:43
@Version :
@Description :旋转矩阵
"""

class Solution:
    def rotate(self, matrix) -> None:
        n = len(matrix)
        # 水平翻转
        i = 0
        j = n -1
        while i < j:
            # 每一列上下翻转
            for k in range(n):
                matrix[i][k], matrix[j][k] = matrix[j][k], matrix[i][k]
            i += 1
            j -= 1

        # 对角线翻转
        for x in range(n):
            for y in range(x):
                matrix[x][y], matrix[y][x] = matrix[y][x], matrix[x][y]

    def rotate2(self, matrix) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """

        # 方法二
        l = len(matrix)
        # 先以对角线(左上-右下)为轴进行翻转
        for i in range(l - 1):
            for j in range(i+1,l):
                temp = matrix[i][j]
                matrix[i][j] = matrix[j][i]
                matrix[j][i] = temp

        # 每一行中点两边交换元素交换
        mid = l >> 1
        for i in range(l):
            for j in range(mid):
                temp = matrix[i][j]
                matrix[i][j] = matrix[i][l-1-j]
                matrix[i][l-1-j] = temp

    # 方法三: 多使用一个矩阵,内存较大
    def rotate2(self, matrix) -> None:

        n = len(matrix)
        matrix_ = [i.copy() for i in matrix]
        for i in range(n):
            for j in range(n):
                matrix_[j][n-1-i] = matrix[i][j]
        # 注意这里是引用拷贝 不能写成 matrix = matrix_
        matrix[:] = matrix_


    # 翻转m次
    def num(self, matrix, m):
        while m > 0:
            self.rotate(matrix)
            m -= 1
        print([x for x in matrix])

if __name__ == '__main__':
    s = Solution()
    m = [[1,2,3],[4,5,6],[7,8,9]]
    s.num(m, 3)

第二题:1702. 修改后的最大二进制字符串

题目描述:

给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改:

操作 1 :如果二进制串包含子字符串 “00” ,你可以用 “10” 将其替换。
比方说, “00010” -> “10010”

操作 2 :如果二进制串包含子字符串 “10” ,你可以用 “01” 将其替换。
比方说, “00010” -> “00001”

请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x 对应的十进制数字大于二进制字符串 y 对应的十进制数字,那么我们称二进制字符串 x 大于二进制字符串 y 。

示例 1:

输入:binary = "000110"
输出:"111011"
解释:一个可行的转换为:
"000110" -> "000101" 
"000101" -> "100101" 
"100101" -> "110101" 
"110101" -> "110011" 
"110011" -> "111011"
示例 2:

输入:binary = "01"
输出:"01"
解释:"01" 没办法进行任何转换。

分析

本题通过二进制变换找到最大的二进制数,第一个‘0’之前的1全部不动,之后的1全部移到末尾,'00’通过转换变为‘10’

代码解析

class Solution:
    def maximumBinaryString(self, binary: str) -> str:
        pass
        # 自己写的:完全没有深入琢磨题的意思
        # l = len(binary)
        # if l <= 1:
        #     return binary
        # i = l - 2
        # while binary[i] == '1' and i >= 0:
        #     for i in range(i,l):
        #         i -= 1
        # j = 0
        # while j < i and binary[j:j+2] == "00":
        #     binary[i:i+2] = "10"
        #     j += 1
        # return binary
        # 
        # num = 0
        # start = 0
        # for i in range(l):
        #     if binary[i] == '0':
        #         num += 1

    # 方法二:失败
    def maximumBinaryString2(self, binary: str) -> str:
        l = len(binary)
        left = 0 # 左边1 的个数
        right = 0 # 右边1的个数
        flag = True
        for i in range(l):
            flag = (flag and binary[i] == "1")
            left += (flag and binary[i] == '1')
            right += (not flag and binary[i] == '1')

        if left + right < l -1:
            for i in range(l):
                k = l - 1 - right
                if i == k:
                    binary[i] = '0'
                else:
                    binary[i] = '1'
                # binary[i] = (i == k ? '0' : '1' )
        return binary

    # 方法三:通过统计0 两边1的个数确定
    def maximumBinaryString3(self, binary: str) -> str:
        import collections

        l = len(binary)
        high1 = 0
        start1 = 0
        for i in range(l):
            if binary[i] == '0':
                break
            # high1 统计第一个0 之前连续1 的个数
            high1 += 1

        # 此方法用于用于计数可哈希对象,返回一个dict 类型,统计每个数据的个数, 多学习呀
        num = collections.Counter(binary)
        if num['0'] == 0:
            return binary
        # 统计第一个0 之后1的个数
        end1 = num['1'] - high1
        # 由00 -> 10 转换后1的个数
        start1 = l - 1 - end1
        return '1' * start1 + '0' + '1' * end1

    # 方法四: 统计第一个0前面1的个数,和0的个数
    def maximumBinaryString3(self, binary: str) -> str:
        l = len(binary)
        start = -1
        cnt = 0
        for i in range(l):
            if binary[i] == '0':
                cnt += 1
                if start == -1:
                    # 记录从第一位开始连续是1的个数
                    start = i
        # 此时全部是1
        if start == -1:
            return binary
        #第一个0 后面1的个数:
        end = l - start - cnt
        # 此时有cnt 个0,这经过000...0 -> 111...0转换后有(cnt - 1)个1,1个0
        return '1' * start + '1' * (cnt - 1) + '0' + '1' * end

if __name__ == '__main__':

    s = "hello"
    # s[0:2] = "11" # 语法错误,string 是不可变类型
    print(s)
    print(s[0:2])
    print(s[-1])

    left = 0
    flag = True
    left += flag and s[0] == 'h'
    print("flag and s[0] == 'h': ", flag and s[0] == 'h') # flag and s[0] == 'h':  True
    print(1 + True) # 2
    print("left: ",left) # left:  1
    print("True:  ",True) # True:   True
    print(int(True)) # 1

祝好!

更多文章,请关注公众号:编程牧马人

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

荣耀社招笔试 的相关文章

随机推荐

  • 一些数学符号

    阿尔法 贝塔 伽玛 德尔塔 伊普西隆 泽塔 伊塔 西塔 约塔 卡帕 兰姆达 米欧 纽 克西 欧米克隆
  • 第4题:请编写一个函数void fun(char *tt,int pp[]),统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。

    C试题 第4题 请编写一个函数void fun char tt int pp 统计在tt字符串中 a 到 z 26个字母各自出现的次数 并依次放在pp所指数组中 ChatGPT回答如下 主要考察了以下几个知识点 字符串的基本操作 在 C 语
  • 双峰逻辑映射【基于matlab的动力学模型学习笔记_7】

    仅当作学习笔记 若有纰漏欢迎友好交流指正 此外若能提供一点帮助将会十分荣幸 本文利用Lyapunov指数 着重从混沌特性展现双峰逻辑映射与逻辑映射之间的区别 所谓的一维双峰逻辑映射 是因为它在第一次迭代中会出现一个双峰 如下图所示 图1 双
  • java 数字范围正则_Java 正则表达式

    正则表达式 概述 正则表达式定义了字符串的模式 正则表达式可以用来搜索 编辑或处理文本 正则表达式并不仅限于某一种语言 但是在每种语言中有细微的差别 java util regex 包主要包括以下三个类 Pattern 类 pattern
  • 可转债网格交易策略回测

    什么是网格交易策略 基于股票波动高抛低吸策略 自动化反复买卖赚取差价 投资者借助条件单 把资金分成多份 从基准价开始 每跌x 就自动买入一份 每涨y 就自动卖掉一份 股价越波动高抛低吸的机会越多 什么是交易策略回测 设定了交易策略后 基于历
  • 安卓pos机开发!写给互联网大厂员工的真心话,附带学习经验

    前言 19年6月份从网易云音乐离开 放弃了留学机会 开始了人生的第一次创业 前后尝试了两个项目 因为个人能力与时机因素都失败了 虽然没能享受到创业所能够带来高杠杆物质上的回报 但是对个人软技能和自我边界认知上都有了很大的提升 对于这段经历有
  • [Error] invalid operands of types 'float' and 'int' to binary 'operator%' c错误

    错误提示告诉你 的所有两边 一个是整形 int 一个是浮点型 float 类型不匹配报错 所以你把应该把 其中一个变量定义成整形
  • 前端(node.js)调用dll动态链接库

    壹 需求 使用 js node 调用dll 动态链接库 github地址如下 包含dll 里面就一个Add方法暴露出来 github 贰 两种方式调用dll 当前开发环境 Windows 11 22H2 node v16 20 0 Pyth
  • logback配置日志

    logback的详细介绍网上有很多 http blog csdn net jibaole article details 52442694 参考文档 使用方法 当我们分清了log4j logback和slf4j的关系后 我们就可以使用它们了
  • [701]labelImg标注工具

    labelImg github https github com tzutalin labelImg exe下载 https tzutalin github io labelImg 用于深度网络训练的数据集做标注的方法和工具有好多 像Lab
  • dockerfile基于apline将JDK20打包成镜像

    dockerfile基于apline将JDK20打包成镜像 今天就来和大家聊聊如何把最新出版的JDK20打包成docker镜像 很多uu都会采用centos作为基础镜像 这么做会有一个问题 centos系统会含有很多库文件 这些库文件JDK
  • Visual Studio Code和IntelliJ IDEA运行spring boot项目

    纯前端 没有java经验 要运行一个spring boot项目 根据别人博文运行成功 现整理到本文 以更基础的方式写步骤 参考博文 超详细的VsCode创建SpringBoot项目 图文并茂 yd的博客 CSDN博客 一 Java环境配置
  • Pytorch多GPU训练:DataParallel和DistributedDataParallel

    引言 Pytorch有两种方法实现多GPU训练 分别是DataParallel DP 和DistributedDataParallel DDP DP实现简单 但没有完全利用所有GPU资源 DDP实现相对复杂 但是更快 我建议使用DDP DP
  • bert入门之分词源码解析

    bert编码方法 概括起来 就分词和id映射 我们先看一下分词的两个方法 一 BasicTokenizer 大致流程 转成 unicode gt 去除各种奇怪字符 gt 处理中文 gt 空格分词 gt 去除多余字符和标点分词 gt 再次空格
  • 国内就能用的Chat-GPT分享

    人工智能在语音理解与交互的新里程碑 AI聊天平台 在人工智能 AI 领域 语言模型的发展日新月异 这其中 OpenAI所推出的GPT系列语言模型尤为显眼 尤其是其中的一员 ChatGPT 已经在人工智能的语言理解与交互方面设定了一个新的里程
  • PB安装步骤

    安装PowerBuilder 9 0具体步骤 1 解压压缩包 双击 SETUP 2 点击 Next 3 点击 Yes 4 点击 Next 5 选择好安装到的文件夹 点击 Next 6 选择组件 我只选择PowerBuilder 点击 Nex
  • 如何加载HTML页面页面到另一个界面中

    1 第一种 iframe 但是 对于个人经验来说 iframe最好不要用 不仅自适应不太好 而且对于seo优化特别不好 2 第二种 通过jQuery load 事件加载页面 比较简单 但是会刷新界面 不过个人感觉影响不大 可以return
  • 3、初识程序

    数据结构静态的描述了数据元素之间的关系 高效的程序需要在数据结构的基础上设计和选择算法 高效的程序 恰当的数据结构 合适的算法 算法是特定问题求解步骤的描述 在计算机中表现为指令的有限序列 算法是独立存在的一种解决问题的方法和思想 特性 输
  • 如何开始学习大数据

    最近很多人都想学习大数据开发 但是却不知道如何开始学习 传统的web应用 LAMP JavaEE NODE系等 与大数据什么关系 推荐一个大数据学习群 142973723每天晚上20 10都有一节 免费的 大数据直播课程 专注大数据分析方法
  • 荣耀社招笔试

    荣耀社招笔试题纪录篇 原文链接荣耀社招笔试题 十一放假回家参加了荣耀社招笔试 两道算法题 解析仅供参考 第一题 旋转矩阵 题目描述 给你一幅由 N N 矩阵表示的图像 其中每个像素的大小为 4 字节 请 你设计一种算法 将图像旋转 90 度